0

Day-Month-Year Hour.Minute.Seconds として表示されるテーブルに Date フィールドがあり、同じ Ertnumber と Date があるときに HOUR フィールドを更新しようとしています。フィールドを同じ Ertnumber で更新することはできますが、日付が同じであることを確認しようとすると、エラーが発生します。DateTime 形式を SQL と同じにするのに問題があります。次のようにして、C# で DateTime を作成します。

DateTime dateStamp = new DateTime(2013, 2, 14, 1, 0, 0);

これが私の更新文字列です。

String.Format("update sdeadmin.meter_data_fixed_network set HOUR{2} = {0} where ERTNUMBER = '{1}' and DATETIME = '{3}'", this.Read, this.ertNumber, this.Stamp.Hour, this.DateStamp.ToString("MMddyyyyHHmmss"));
4

3 に答える 3

4

次のようなことを試してください: SQL クエリの日時パラメータ String.Format() ではなく、パラメータ化されたクエリを実行する必要があります。

于 2013-05-15T17:02:12.727 に答える
2

クエリのパラメーター化は、この問題を解決するはずです。ただし、問題は実際には 2 つの部分に分かれています。HOUR+stamp.Hour,最初に、変更可能な列名とクエリ パラメータを参照するクエリを作成する必要があります。

したがって、次のようなものがうまくいくはずです。

string query = 
   String.Format("update sdeadmin.meter_data_fixed_network SET HOUR{0} = @read WHERE ERTNUMBER = @ertnumber AND DATETIME = @date;", this.Stamp.Hour);

HOURこれにより、基本的なクエリが作成されます。 のそれぞれの列を更新するパラメータ化されたクエリがあることがわかりますsdeadmin.meter_data_fixed_network。あとは、接続オブジェクト、コマンド オブジェクトを作成し、パラメータを追加してから実行するだけです。

例えば:

//Create the connection
using(SqlDbConnection connection = new SqlDbConnection("your_connection_string"))
{
    //Create the Command
    using(SqlDbCommand command = new SqlDbCommand(query))
    {
      //Set up the properties of the command and the parameters
      command.CommandType = CommandType.Text;
      command.Connection = connection;
      command.Parameters.AddWithValue("@read", Read);
      command.Parameters.AddWithValue("@ertnumber", ertNumber);
      command.Parameters.AddWithValue("@date", DateStamp);
      //Have to open the connection before we do anything with it
      connection.Open();
      //Execute the command. As we don't need any results back we use ExecuteNonQuery   
      command.ExecuteNonQuery();

    }
}//At this point, connection will be closed and disposed - you've cleaned up

クエリをパラメーター化することには、いくつかの利点があります。

  1. SQL インジェクション攻撃の防止に役立ちます
  2. 多くのデータベース エンジンは、パラメーター化されたクエリの実行プランを再利用できるため、パフォーマンスが向上します。

@JeffAtwood は数年前にこのテーマについて書いています: http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

また、 USINGステートメントの使用にも注意してください。これにより、それぞれの使用の範囲を離れるとすぐに、接続オブジェクトとコマンド オブジェクトが確実に破棄されます。.Net は制御できるリソースを管理しますが、ファイル ハンドル、データベース接続などの外部リソースは管理できないため、これは重要です。そのため、自分でクリーンアップすることが重要です。Dispose for Connection も明示的に閉じます。

于 2013-05-15T17:12:31.383 に答える
0

(SQL Server のことだと仮定して): SQL Server で使用するのに最適な日付形式は ISO 8601 です。

yyyyMMdd HHmmss.

ただし、String.Format を使用して SQL を記述することは、ひどい習慣です。パラメータを指定して System.Data.SQLClient.SQLCommand を使用すれば、フォーマットに悩まされることはありません。

DateTime dateStamp = new DateTime(2013, 2, 14, 1, 0, 0);

System.Data.SQLClient.SQLConnection cxn; // make sure to set this up and open it

System.Data.SQLClient.SQLCommand cmd = new System.Data.SQLClient.SQLCommand(
     String.Format("update sdeadmin.meter_data_fixed_network set HOUR{0} = @value where ERTNUMBER = @ert and DATETIME = @date", this.Stamp.Hour)
     ,cxn );

cmd.Parameters.Add(new SqlParameter("@value", this.Read);
cmd.Parameters.Add(new SqlParameter("@ert", this.ertNumber);
cmd.Parameters.Add(new SqlParameter("@date", this.Stamp);
cmd.ExecuteNonQuery();
于 2013-05-15T17:09:24.153 に答える