0

smalldatetimeC#を使用して日付と時刻を取得し、それをSQLSERVERのデータ型に挿入しようとしています。

これは私がそれをやろうとする方法です:

DateTime date = DateTime.Now;

        sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)VALUES (1,'','','',2,'1',"+ date +")";

        dataObj = new DataObj();
        dataObj.InsertCommand(sql);


  connection = new SqlConnection(conn);
        connection.Open();

        cmd = new SqlCommand(sql, connection);
        cmd.ExecuteNonQuery();
        connection.Close();

そして、それは私に「'16'の近くの間違った構文」を与えます。私の現在の時刻、つまり現在の16:15を参照していると思います。

4

2 に答える 2

3

パラメータを使用することをお勧めします。 cmd.Parameters.AddWithValue("@date", date.toString);AddWithField適切な変換を処理します。

InsertSQLステートメントは次のようになります。

sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)VALUES (1,'','','',2,'1',@date)";
于 2012-08-06T13:19:25.407 に答える
1

次の2つの理由で機能しません。

  1. 日付パラメータはdate.ToString()を呼び出す必要があります
  2. 日付文字列がインラインクエリに挿入される前後に、次のように一重引用符を追加する必要があります。

    sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,
    YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)
    VALUES (1,'','','',2,'1','"+ date +"')";
    

ただし、上記の戦略は、文字列を実行方法で連結することによってSQLインジェクション攻撃にさらされるため、また一重引用符などの追加について心配する必要があるため、適切ではありません。

より良いアプローチは、次のようにパラメータを使用することです。

sql = "INSERT INTO YTOODLE_LINKS (YTOODLE_LINKS.TASK_ID,YTOODLE_LINKS.LINK_TITLE,YTOODLE_LINKS.LINK_DESC,
    YTOODLE_LINKS.LINK_PATH,YTOODLE_LINKS.USER_ID,YTOODLE_LINKS.LAST_USER_EDIT)
    VALUES (@First,@Second,@Third,@Fourth,@Fifth,@Sixth,@YourDate)";

cmd.Parameters.AddWithValue("@First", 1);
// ... and so on
cmd.Parameters.AddWithValue("@YourDate", date);

これで、SQLインジェクション攻撃や、データ型などに応じて一部のパラメーターに一重引用符を追加することを心配する必要がなくなります。すべてが透過的で、安全であり、データベースエンジンが実行プランを最適化できるようになります。クエリ。

于 2012-08-06T13:25:32.843 に答える