2016-03-24 8 views
0

こんにちは、私はvarcharのメモフィールドとdatetimefieldにアクセスする必要があるテーブルから削除しようとします。ここでWHERE句でvarcharとdatetimeフィールドを含む削除クエリを実行する方法

は、コードは次のとおりです。

DateTime test = (DateTime)powerPlant.timestamp; 
string DateUS = test.ToString("s"); 

string deletePowerPlant = 
    String.Format(
    "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(datetime,"+ DateUS +",111) AND [note] = {0};", 
    note); 

SqlCommand sqlDelete = new SqlCommand(deleteComponents, sqlConnection); 
sqlDeletePowerPlant.CommandType = CommandType.Text; 
sqlDeletePowerPlant.CommandText = deleteComponents; 
sqlDeletePowerPlant.ExecuteNonQuery(); 

とはい通常、私は、SQLパラメータを使用しますが、私はそれだけで何とかそれが可能でなければならないbecouseそれをテストするためのパラメータなしで動作する方法を知りたいです。私はそれを他のフォーラムやブログと一緒にgoogleにしようとしたが運がなかった。

あなたの助けと私の英語のためにごめんなさいThx。

EDIT

フィールドのタイムスタンプは、テーブル内の日時です。 noteは、表のnvarcharです。そして、私はただ一度それを使用したいので、私はパラメータなしでそれを行う方法を知っていると言うことができます。私はその悪いを知っている....

+0

あなたの '{0}'の周りに '' 'sを置く必要がありますが、それ以外にあなたの持っているものは何ですか? – CodingGorilla

+0

[documentation](https://msdn.microsoft.com/de-de/library/ms187928(v = sql.120).aspx)によると、書式指定子111は日本語の 'jjjj/mm/tt'です。 101を意味しましたか? – dlatikay

+0

エラーの原因としては、datetimeオブジェクトを比較する可能性があります。これは日付と時刻の比較につながりますので、SQLのインスタンスのDATE()関数を使用して、時刻だけでなく日付を比較することもできます。 – Trickzter

答えて

0

サーバーのオペレーティングシステムのロケールに依存しないようにする必要があります。ですから、SQLクエリで特定のフォーマット(あなたの場合は111)を使用する場合は、文字列にあなたの日付を変換するために、.NETの同等のものを使用する必要があります。そのCONVERT機能がサポートするフォーマットの詳細については

string DateUS = test.ToString("yyyy/MM/dd"); 

、ここを参照してください: https://msdn.microsoft.com/de-de/library/ms187928(v=sql.120).aspx

あなたが質問で自分を述べたように、(強く型付けされた)SqlParameterを使用して行くための好ましい方法です。そうしないと、SQLインジェクションの脆弱性が生じる可能性があります。

noteがテキスト列であることを考えると、単一引用符とエスケープが必要になります

String.Format(
    "DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp]=CONVERT(datetime,'{0}',111) AND [note]='{1}'", 
    DateUS 
    note.Replace("'","''").Replace(@"\",@"\\") 
); 

あなたも時刻を保存する場合、=との比較は、ゼロ以外の時間コンポーネントを持つレコードには影響しません。

+0

GarethDとあなたからのチップで、それは助けのためにthxを動かす – opelhatza

0

はそこにいくつかの文字列修飾子を入れ

のDateTimeテスト=(日時)powerPlant.timestamp。 string DateUS = test.ToString( "s");

string deletePowerPlant = String.Format("DELETE FROM [dbo].[tblSPpowerPlants] WHERE [timestamp] = CONVERT(datetime,'"+ DateUS +"',111) AND [note] = '{0}';", note); 
    SqlCommand sqlDelete = new SqlCommand(deleteComponents, sqlConnection); 
    sqlDeletePowerPlant.CommandType = CommandType.Text; 
    sqlDeletePowerPlant.CommandText = deleteComponents; 
    sqlDeletePowerPlant.ExecuteNonQuery(); 

本当に。パラメータ化されたクエリを使用する

+0

面白いことに、私はSQLサーバでそれを試してみました。本当に奇妙な.... – opelhatza

関連する問題