2010-12-30 70 views
0

SQLテーブルに日付を挿入しようとしていますが、プログラムの実行時に次のエラーが発生します。SQLに日付を挿入

文字列から日付および/または時刻を変換するときに変換に失敗しました。

string dateReleased = DateReleasedDate.Value.ToString("YYYY-MM-DD"); 

string myQuery = "INSERT INTO GameTbl (gameName, genreID, players, online, dateReleased, dateAdded, developerID, publisherID, consoleID) VALUES('" 
       + GameNameTxt.Text + "', '" + GenreCombo.SelectedValue + "', '" + PlayersNUD.Value + "', '" + OnlineCombo.SelectedText + "', '" 
       + dateReleased + "', 'GETDATE()', '" + DeveloperCombo.SelectedValue + "', '" 
       + PublisherCombo.SelectedValue + "','" + ConsoleCombo.SelectedValue + "')"; 
+4

アプリケーションにSQLインジェクションの脆弱性を回避するために、 'SqlParameter' Sを使用してください。 –

+1

@Klaus:+1 http://xkcd.com/327/ – abatishchev

答えて

5

パラメータ化クエリを使用してください。限りdateAdded列が懸念しているとして、私は単にINSERTからそれを除去するであろうし、SQLデータベースに直接それをデフォルトの値を追加

using (var conn = new SqlConnection("SOME CONNECTION STRING")) 
using (var cmd = new SqlCommand(conn)) 
{ 
    conn.Open(); 
    cmd.CommandText = "INSERT INTO GameTbl (gameName, genreID, players, online, dateReleased, developerID, publisherID, consoleID) VALUES (@gameName, @genreID, @players, @online, @dateReleased, @developerID, @publisherID, @consoleID)"; 
    cmd.Parameters.AddWithValue("@gameName", GameNameTxt.Text); 
    cmd.Parameters.AddWithValue("@genreID", GenreCombo.SelectedValue); 
    cmd.Parameters.AddWithValue("@players", PlayersNUD.Value); 
    cmd.Parameters.AddWithValue("@online", OnlineCombo.SelectedText); 
    cmd.Parameters.AddWithValue("@dateReleased", DateReleasedDate.Value); 
    cmd.Parameters.AddWithValue("@developerID", DeveloperCombo.SelectedValue); 
    cmd.Parameters.AddWithValue("@publisherID", PublisherCombo.SelectedValue); 
    cmd.Parameters.AddWithValue("@consoleID", ConsoleCombo.SelectedValue); 
    var result = cmd.ExecuteNonQuery(); 
    ... 
} 

:私はSQLクエリを構築するために使用される文字列の連結を見たときに私の目を傷つけます。

DateTimeのインスタンスを直接渡す方法に注意し、ADO.NETの形式をそのままにしておきます。ボーナスとして、あなたのコードはSQLインジェクションに対して安全です。

1
DateReleasedDate.Value.ToString("yyyy-MM-dd"); 
+4

パラメータ化した方がいいでしょうか? – gbn

+0

@gbn:はい。絶対に。しかし、私はちょうど同じエラーを生成することを試みた回答 – abatishchev

+0

で答えたエラーを修正する解決策を与えました – dbomb101

0

問題は、GETDATE()を一重引用符で囲むことです。文字列 'GETDATE()'を日付に変換しようとしています。

0

.net、IMOからSQLに日付を渡す最も良い方法は、.ToOADate関数を使用することです。

この関数は、地域の設定に関係なく、任意のデータベースのdatetime \ dateフィールドで動作する日付の数値表現を渡します。

あなたのためのいくつかの情報:ToOADate

関連する問題