1

SQL ステートメントを実行したいのですが、構文に問題があります。誰かが私が間違っていることを理解するのを手伝ってくれませんか?

ありがとう、アッシュ。

public void AddToDatabase(string[] WordArray, int Good, int Bad, int Remove)
{

    for (int WordCount = 0; WordCount < WordArray.Length; WordCount++)
    {
        string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (" + WordArray[WordCount] + ", " + Good + ", " + Bad + ", " + Remove + ")";

        Debug.Print(sSQL);

        //Private m_recordset As ADODB.Recordset
        //Private m_connection As ADODB.Connection
        ADODB.Recordset RS;
        ADODB.Connection CN ;


        CN = new ADODB.Connection();
        RS = new ADODB.Recordset();

        CN.CursorLocation = ADODB.CursorLocationEnum.adUseClient;

        CN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=doom_calc_dict.mdb;jet OLEDB:database";
        CN.Open(CN.ConnectionString,"","",0);

        object dummy = Type.Missing;

        CN.Execute(sSQL,out dummy,0);

        RS.Close(); 
        CN.Close(); 

        //string sSQL = "SELECT Word FROM WordDef WHERE Word='" + WordArray[WordCount] + "'";
        DatabaseTools.LoadDataFromDatabase(sSQL);
        //DatabaseTools.LoadDataFromDatabase(sSQL);

    }
}
4

5 に答える 5

18

修正する必要がある最も重要なことは、文字列を動的に構築するのではなく、クエリ パラメーターを使用することです。これにより、パフォーマンス、メンテナンス、およびセキュリティが向上します。

さらに、厳密に型指定された新しい ADO.Net オブジェクトを使用したいと考えています。の using ディレクティブを必ず追加してくださいSystem.Data.OleDb

usingこのコードのステートメントに注目してください。接続が終了したら、接続が閉じていることを確認します。データベース接続は限られた管理されていないリソースであるため、これは重要です。

最後に、実際にはコードで配列を使用していません。本当に気にするのは、単語のコレクションを反復処理する機能だけなのでIEnumerable<string>、配列の代わりにを受け入れたいとします。心配しないでください。この関数は、配列を渡す必要がある場合、配列を引数として受け入れます。

public void AddToDatabase(IEnumerable<string> Words, int Good, int Bad, int Remove)
{
    string sql = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES (@Word, @Good, @Bad, @Remove)";

    using (OleDbConnection cn = new OleDbConnection("connection string here") )
    using (OleDbCommand cmd = new OleDbCommand(sql, cn))
    {
        cmd.Parameters.Add("@Word", OleDbType.VarChar);
        cmd.Parameters.Add("@Good", OleDbType.Integer).Value = Good;
        cmd.Parameters.Add("@Bad", OleDbType.Integer).Value = Bad;
        cmd.Parameters.Add("@Remove", OleDbType.Integer.Value = Remove;

        cn.Open();

        foreach (string word in Words)
        {
            cmd.Parameters[0].Value = word;
            cmd.ExecuteNonQuery();
        }
    }
}

もう 1 つ: OleDb でクエリ パラメーターを使用する場合は、それらを順番に追加することが重要です。

更新: VS 2005 / .Net 2.0 で動作するように修正されました (VS 2008 の機能に依存していました)。

于 2009-04-23T20:09:36.420 に答える
3

最初は、私が役に立っていないように見えるでしょう。でも、本当はあなたを助けようとしているので、そのように受け取ってください。これこのSTATを読む必要があります!それが完了したら、ここにいくつかの適切でクリーンなADO.NET の例を示します。

于 2009-04-23T20:06:13.370 に答える
0

いいえ、次のように必要です。

string query = "INSERT INTO Table_PersonInfo
(PersonID,Surname
,[Family Name]
,AddsOnName
,Street,Number
,PostalCode
,[City of Birth]
,[Year of Birth]
,[Phone Number])
 VALUES
 ('"+@personID+"'
, '"+ @surname + "' 
, '"+@familyname+"'
, '"+@nameExtension+"'
, '"+@street+"'
, '"+@houseNumber+"'
, '"+ @postalCode+"'
, '"+@yearofbirth+"'
, '"+@placeofbirth+"'
, '"+@phoneNumber+"')";
于 2009-08-26T10:21:54.920 に答える
0

これを試してください (アプリケーションの外部から SQL を実行してみてください):

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ");";
于 2009-04-23T20:02:22.863 に答える
0

SQL ステートメントの最初の引数を一重引用符で囲む必要があります。

string sSQL = "INSERT INTO WordDef (Word, Good, Bad, Remove) VALUES ('" + WordArray[WordCount] + "', " + Good + ", " + Bad + ", " + Remove + ")";

文字フィールドと日付フィールドでは、値を「一重引用符」で囲む必要があります

于 2009-04-23T20:03:45.403 に答える