17

SQLite をストレージとして使用しようとしています。nuget と using ステートメントを使用して、参照 dll も追加しました。

私は持っている

private void SetConnection()
{
            sql_con = new SQLiteConnection
                ("Data Source=c:\\Dev\\MYApp.sqlite;Version=3;New=False;Compress=True;");
}

private void ExecuteQuery(string txtQuery)
{
            SetConnection();
            sql_con.Open();
            sql_cmd = sql_con.CreateCommand();
            sql_cmd.CommandText = txtQuery;
            sql_cmd.ExecuteNonQuery();
            sql_con.Close(); 
}

そして、私はこのようにクエリtxtを送信しています

public void Create(Book book)
{
            string txtSqlQuery  = "INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) ";
            txtSqlQuery += string.Format("VALUES (@{0},@{1},@{2},@{3},@{4},@{5},@{6},@{7},{8})", 
                        book.Id, book.Title, book.Language, book.PublicationDate, book.Publisher, book.Edition, book.OfficialUrl, book.Description, book.EBookFormat);
                   try
                   {
                       ExecuteQuery(txtSqlQuery);
                   }
                   catch (Exception ex )
                   {
                       throw new Exception(ex.Message);
                   }    
}

私のデータベースは正しく作成され、有効なデータを持つ本のインスタンスが渡されても問題ありません。ただし、次のコード行でクエリを実行すると、常に例外がスローされます。

sql_cmd.ExecuteNonQuery();

私は明らかにここで何か間違ったことをしていますが、見ることができません。

更新:スローされた例外メッセージは

SQL 論理エラーまたは欠落しているデータベース

認識されないトークン: "22cf"

これ22cfは、渡されたbook.IdGUID 文字列の一部です。

4

4 に答える 4

54

ステートメントにデータを挿入しないでください。

プリペアド ステートメントとバインド パラメータを使用します。

public void Create(Book book) {
    SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) VALUES (?,?,?,?,?,?,?,?,?)", sql_con);
    insertSQL.Parameters.Add(book.Id);
    insertSQL.Parameters.Add(book.Title);
    insertSQL.Parameters.Add(book.Language);
    insertSQL.Parameters.Add(book.PublicationDate);
    insertSQL.Parameters.Add(book.Publisher);
    insertSQL.Parameters.Add(book.Edition);
    insertSQL.Parameters.Add(book.OfficialUrl);
    insertSQL.Parameters.Add(book.Description);
    insertSQL.Parameters.Add(book.EBookFormat);
    try {
        insertSQL.ExecuteNonQuery();
    }
    catch (Exception ex) {
        throw new Exception(ex.Message);
    }    
}
于 2013-10-21T08:40:44.097 に答える
-4

文字列を INSERT ステートメント VALUES (@{0},'@{1}','@{2}','@{3}','@{4}','@{ 5}','@{6}','@{7}',{8}) SQLExeprion もキャッチする必要があります

于 2013-10-20T15:32:22.050 に答える