1

次のコードで何が間違っていますか? 日時をSQLサーバーの日時フィールドに保存しています。

private void button1_Click(object sender, EventArgs e)
    {
        string d = DateTime.Now.ToShortDateString();
        cmd.CommandText = "insert into trans values("+label9.Text+",'d');";
        cmd.Connection = con;
        con.Open();
        int x= cmd.ExecuteNonQuery();
        MessageBox.Show("Attendance recorded succesfully");
4

3 に答える 3

4

これは、SQL インジェクション用に開かれているため、非常に悪いアプローチです。SqlParameter を使用することをお勧めします。

cmd.CommandText="insert into trans values(@label, @date)";
cmd.Parameters.AddWithValue("label", int.Parse(label9.Text));
cmd.Parameters.AddWithValue("date", DateTime.Now);
cmd.Connection = con;
con.Open();
int x= cmd.ExecuteNonQuery();
于 2012-04-11T07:38:50.583 に答える
2

文字列に入力ミスがありCommandTextます。代わりにこれを使用してください

cmd.CommandText="insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");";

編集:

完全に編集されたコードは次のようになります。usingステートメントは更新を破棄することに注意してください。安全なコードが必要な場合は、代わりにパラメーターを使用する必要があります。

private void button1_Click(object sender, EventArgs e)
{
    using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost; Initial Datalog=myDatabase; Integrated Security=TRUE;")) 
  {
      using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("insert into trans values("+label9.Text+","+DateTime.Now.ToString()+");", connection)) 
    {
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
     }
  }
}
于 2012-04-11T07:37:09.363 に答える
1

インラインSQLを使用しているという事実は別として、これは悪いことです。@param1クエリで構文を使用し、代わりにパラメーターを追加する必要があります (したがって、この問題も回避します)。さらに良い - Linq to Sql または Entity Framework (または nHibernate など) のような ORM を使用します。

SQL Serverは通常、yyyymmdd形式の時間を必要とします。また、ラベルの値が実際に整数であることを確認し、整数である場合にのみクエリを実行する必要があります。

int labelValue = 0;
if(int.TryParse(label9.Text, out labelValue))
{
  cmd.CommandText="insert into trans values("+ labelValue +
    ", '" + DateTime.Now.ToString("yyyyMMdd");"')"; 
  cmd.Connection = con;      
  con.Open();      
  int x= cmd.ExecuteNonQuery();      
  MessageBox.Show("Attendance recorded succesfully");
}     

また、接続/コマンドの使用法を本当に調べる必要があると思います-どこにいますDisposeか? このコードから判断すると、そうではないと思いますか?

全体として、これらの修正を行ったとしても、私はあなたがこの方法で物事を行うことをお勧めしません - Harm が示唆する方法で行う - そこにある +5 (またはそれ以上) は当然です.

于 2012-04-11T07:38:26.607 に答える