0

データベース テーブルに日時値を挿入しようとしていますが、問題が発生しています。これを実行しようとするたびに、次のメッセージが表示されます。

varchar データ型を datetime データ型に変換すると、範囲外の値になりました。ステートメントは終了されました。

これは私のコードです:

public static void  DoQuery(string fileName, string sql)
{

    SqlConnection conn = ConnectToDb(fileName);
    conn.Open();
    SqlCommand com = new SqlCommand(sql, conn);
    com.ExecuteNonQuery();
    com.Dispose();
    conn.Close();
  
}
    private void button1_Click(object sender, EventArgs e)
    {
        SqlConnection cn = new SqlConnection();
        cn.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename='c:\users\***\***\visual studio 2010\Projects\***\***\Database.mdf';Integrated Security=True;User Instance=True";
        cn.Open();
        string[] dateArr = dateBox.Text.Split('/');
        int[] dateInt = new int[3];
        for (int i = 0; i < 3; i++)
        {
            dateInt[i] = Int16.Parse(dateArr[i]);
            MessageBox.Show(dateInt[i]+"");
        }
        DateTime date = new DateTime(dateInt[2],dateInt[1],dateInt[0]);
        
        string sql = "INSERT INTO existProducts(name,date,price,amount) VALUES ('" + nameBox.Text + "','" + date + "','" + priceBox.Text + "','" + amountBox.Text + "')";

        MyAdoHelper.DoQuery("Database.mdf", sql);
        MessageBox.Show("Success!");
       
        cn.Close();
    }

注 1: 例外処理がありましたが、常にこの例外を処理する必要があり、プログラムがうまく実行されなかったため、削除しました。

注 2: 接続文字列を検閲しましたが、接続があり、正常に動作します。

4

2 に答える 2

3

パラメータを使用すると、おそらく問題が解決され、(もう 1 つの重要なこと)インジェクション攻撃からも保護されます。

于 2013-01-21T07:32:58.033 に答える
0

挿入ステートメントで文字列の日付値を使用する.....

insert ステートメントで SqlParameters を使用します。

INSERT INTO existProducts (name,date,price,amount) VALUES (@name, @date, @price, @amount)


public static void  DoQuery(string fileName, string name, DateTime date, float price, float amount)
{

    SqlConnection conn = ConnectToDb(fileName);
    conn.Open();
    SqlCommand com = new SqlCommand(sql, conn);
    com.Paramaters.AddWithValue("name", name);
    com.Parameters.AddWithValue("date", date);
    ...
    ...
    com.ExecuteNonQuery();
    com.Dispose();
    conn.Close();

}
于 2013-01-21T07:35:58.593 に答える