0

SQL テーブルに書き込んでから削除しようとしています。WRITE コードは問題ありませんが、DELETE コードが思い通りに機能しません。

//SQL_ConnectionString defined above
SqlConnection SQL_Connection = new SqlConnection(SQL_ConnectionString)

string   INSERT =  "INSERT INTO " + tbTable_DAQ.Text + " (Date, Time, Comment)";
string   VALUES =  "VALUES " + " (@Date,    @Time,   @Comment)";
string   SQL_WriteString =  INSERT + VALUES;

DateTime DateTimeNow = DateTime.Now;

try
{
   //get time
   DateTimeNow = DateTime.Now;

   //create SQL command object
   SqlCommand SQL_Write = new SqlCommand(SQL_WriteString, SQL_Connection);

   //attach values
   SQL_Write.Parameters.AddWithValue("@Date", DateTimeNow);
   SQL_Write.Parameters.AddWithValue("@Time", DateTimeNow);
   SQL_Write.Parameters.AddWithValue("@Comment", "Table Access Test. ");

   SQL_Write.ExecuteNonQuery();

   //dispose & nullify SQL_Write
   SQL_Write.Dispose();
   SQL_Write = null;
}

catch (Exception eWrite) 
{ 
   MessageBox.Show(eWrite.ToString(), "SQL WRITE ERROR", MessageBoxButtons.OK, 
                                       MessageBoxIcon.Exclamation); 
}

//now delete inserted row from SQL table            
string DELETE = "DELETE FROM " + tbTable_DAQ.Text + " ";
string FROM =  "WHERE " + "Date = " + DateTimeNow  + "AND " + "Time = " + DateTimeNow 
               + "AND " + "Comment='Table Access Test.'"; //not working
string   SQL_DeleteString  = DELETE + FROM;

try 
{ 
   //create SQL command object
   SqlCommand SQL_Delete = new SqlCommand(SQL_DeleteString, SQL_Connection);
   SQL_Delete.ExecuteNonQuery();
   //dispose & nullify SQL_Delete
   SQL_Delete.Dispose();
   SQL_Delete = null;
}

catch (Exception eDelete)     
{ 
     MessageBox.Show(eDelete.ToString(), "SQL DELETE ERROR", MessageBoxButtons.OK, 
                       MessageBoxIcon.Exclamation); 
}

エラーが発生します。エラーは、日付と時刻の列の値によるものだと思います。WRITE コードでは、 (date 型) と(time7 型)DateTimeNowで受信するとSQL テーブルが変換されると思います。ただし、その特定の行を削除するには、値が一致する必要があり (変換は行われません)、値を正しく取得する方法がわかりません。DateTime

4

6 に答える 6

2

非常に具体的な日時値に対してチェックしています。正確に同じ日付と時刻のテーブル レコードがない限り、これは機能しません。

また、日付フィールドと時刻フィールドの両方を日時に対してチェックしています。1 つの日時フィールドだけを比較しないのはなぜですか?

于 2012-07-11T14:46:29.047 に答える
2

SQL パラメータを使用して値を SQL に渡すため、挿入が機能します。これは素晴らしいことです。文字列を作成して実行しようとしているため、DELETE はおそらく構文エラーで失敗します (エラーのテキストを含めるとよいでしょう)。

おそらく、日付を一重引用符で囲んで削除文字列を修正できますが、正しい構文を示したくありません。2 つの大きな理由から、SQL パラメータを再度使用することをお勧めします。

  1. SQL が適切な変換を行います。テキストを正しく変換する心配はありません。
  2. SQL インジェクション (SQL 文字列を作成して実行することによって引き起こされる主要なセキュリティ問題) から身を守っています。
于 2012-07-11T14:47:27.087 に答える
0

自動コミットがオンになっていない場合は、connection.transaction.commit と入力する必要があります。ステータスをキャッチして、最終的に次のようにテストするとよいと思います。

finally
{
  if (status)
  {
    connection.transaction.commit;
  }
  else
  {
    connection.transaction.rollback;
  }
}

コミットがないために挿入されていない行をコードが削除しようとしている可能性があります。しかし、通常は日時の問題です;-)

于 2012-07-11T14:56:40.987 に答える
0

さて、n8wrl の提案に基づいて、SQL DELETE コードに文字列を使用しません。私はそれを次のように変更しました:

        //now delete inserted row from SQL table            
        string DELETE = "DELETE FROM " + tbTable_DAQ.Text + " ";
        string FROM = "WHERE " + "Date = @Date" + " AND " + "Time = @Time" + " AND " + "Comment = @Comment";
        string SQL_DeleteString = DELETE + FROM;

        try
        {
           //create SQL command object
           SqlCommand SQL_Delete = new SqlCommand(SQL_DeleteString, SQL_Connection);

           //attach values
           SQL_Delete.Parameters.AddWithValue("@Date",               DateTimeNow.Date);
           SQL_Delete.Parameters.AddWithValue("@Time",               DateTimeNow.TimeOfDay);
           SQL_Delete.Parameters.AddWithValue("@Comment",            "Table Access Test.");

           SQL_Delete.ExecuteNonQuery();

           //dispose & nullify SQL_Delete
           SQL_Delete.Dispose();
           SQL_Delete = null;
        }

        catch (Exception eDelete) { MessageBox.Show(eDelete.ToString(), "SQL DELETE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }

そして物事はうまくいきます。Hatsoft のご協力に感謝します。乱雑な文字列方式は避けたほうがよいと思います。インジェクション攻撃はしたくありません。それが起こった場合、私は大きな問題になります。つまり、本当にメジャーです。

于 2012-07-11T17:46:49.377 に答える
0

文字列としてSql procにフォーマットされたDateTime.Nowを送信してみてください

たとえば、このように

string formatted = dateNow.ToString("yyyyMMdd");
于 2012-07-11T14:47:28.727 に答える