-1

2つのSQLクエリ文字列があります。1つは機能し、もう1つは機能しません。

動作するもの:

string updateLoginTime = "UPDATE DeviceUsers SET lastLogin = '" + dateTime + "' WHERE ID = '" + userID + "'";

これはしません:

string updateText = "UPDATE DocumentsRead SET timeRead = '" + dateTime + "' WHERE userID = '" + userID + "' AND fileName = '" + fileOnly +"'";

エラーが発生します:

varcharデータ型を日時データ型に変換すると、値が範囲外になりました。

どちらのクエリでも、dateTimeパラメータは文字列としてWebメソッドに渡されます。最初のものが機能するのに2番目のものが機能しない理由はありますか?

-編集-

2番目のクエリは次のようにフォーマットされます。

dateTime = DateTime.Now.ToString("dd-MM-yy HH-mm-ss");

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["EndUsersConnectionString"].ConnectionString)) 
using (var cmd = conn.CreateCommand())
{
    conn.Open();

    cmd.CommandText = "UPDATE DocumentsRead SET timeRead = @timeRead WHERE userID = @userID AND fileName = @fileName";

    cmd.Parameters.AddWithValue("@timeRead", dateTime);
    cmd.Parameters.AddWithValue("@userId", userID);
    cmd.Parameters.AddWithValue("@fileName", fileName);

    cmd.ExecuteNonQuery();
}

それでも同じエラーが発生します。

4

3 に答える 3

10

絶対にしないでください。SQLクエリを作成するために文字列連結を使用しないでください。会いたくない場合は、常にパラメータ化されたクエリを使用してくださいBobby Tables

using (var conn = new SqlConnection(someConnectionString))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "UPDATE DocumentsRead SET timeRead = @timeRead WHERE userID = @userID AND fileName = @fileName";
    cmd.Parameters.AddWithValue("@timeRead", someDateTimeInstance);
    cmd.Parameters.AddWithValue("@userId", userId);
    cmd.Parameters.AddWithValue("@fileName", fileName);
    cmd.ExecuteNonQuery();
}

このようにすると、Bobby Tablesに出会わないだけでなく、クエリが正しく機能します。

SQL開発を行うときに尊重されるべき黄金律は、決して+演算子を使用することではありません。

于 2013-03-18T12:44:16.320 に答える
2

テーブルのプロパティでデータ型を再確認してください。

DeviceUsers.lastLoginタイプは正しくDateに設定されているようですが、DocumentsRead.timeReadが正しく構成されていない可能性があります。

于 2013-03-18T12:45:01.063 に答える
2

SQLクエリを連結することは一般的に悪い習慣であるため、パラメータ化されたクエリを使用することをお勧めします。例: mm/dd/yyyy)

于 2013-03-18T12:46:54.817 に答える