2014-03-25 106 views
2

我在嘗試使用c#編程式輸入DateTime時遇到了下面提到的問題。DateTime插入錯誤

錯誤消息:

一個nvarchar數據類型爲datetime數據類型的轉換導致外的範圍內的值。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string str = ""; 

     OpenFileDialog ob = new OpenFileDialog(); 
     DialogResult dr; 
     dr = ob.ShowDialog(); 
     if (dr == DialogResult.OK) 
     { 
      str = ob.FileName; 

     } 

     SqlConnection con = new SqlConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(); 

     con.ConnectionString = @"Data Source=.;Initial Catalog=PicStore;Integrated Security=True"; 
     cmd.CommandText = "insert into pathstore(paths)values(@path)"; 
     cmd.Connection = con; 

     SqlParameter pa1 = new SqlParameter("@path", DbType.String); 
     pa1.Value = str; 
     cmd.Parameters.Add(pa1); 

     da.InsertCommand = cmd; 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 

     SqlConnection con = new SqlConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     DataTable dt = new DataTable(); 

     con.ConnectionString = @"Data Source=.;Initial Catalog=PicStore;Integrated Security=True"; 
     cmd.CommandText = "select paths from pathstore where [email protected]"; 
     cmd.Connection = con; 

     SqlParameter pa1 = new SqlParameter("@id", DbType.Int32); 
     pa1.Value = textBox1.Text; 
     cmd.Parameters.Add(pa1); 

     da.SelectCommand = cmd; 
     con.Open(); 
     da.Fill(dt); 
     string str1 = dt.Rows[0][0].ToString(); 

     //loading picture into picturebox 
     pictureBox1.Load(str1); 
     MessageBox.Show(str1); 

     //con.Close(); 
     /////////////////////////////////////////////////////// 


     SqlConnection con1 = new SqlConnection(); 
     SqlCommand cmd1 = new SqlCommand(); 
     SqlDataAdapter da1 = new SqlDataAdapter(); 

     con1.ConnectionString = @"Data Source=.;Initial Catalog=PicStore;Integrated Security=True"; 
     cmd1.CommandText = "insert into DtTimeTable (DTime,id) values (@DTime,@id)"; 
     cmd1.Connection = con1; 


     SqlParameter pa2 = new SqlParameter("@DTime", DbType.DateTime); 
     pa2.Value = DateTime.Now.ToString(); 
     cmd1.Parameters.Add(pa2); 

     SqlParameter pa3 = new SqlParameter("@id", DbType.Int32); 
     pa3.Value = textBox1.Text; 
     cmd1.Parameters.Add(pa3); 


     da1.InsertCommand = cmd1; 
     con1.Open(); 
     cmd1.ExecuteNonQuery(); 
     con1.Close(); 

    } 
} 

}

+0

如果你有你的答案,那麼請不要忘記去接受它。 – Shell

回答

4

這就是問題所在:

SqlParameter pa2 = new SqlParameter("@DTime", DbType.DateTime); 
pa2.Value = DateTime.Now.ToString(); 

你說的參數是DateTime,但此時你轉換它到一個字符串 - 而且很可能在不同的文化中與服務器所期望的一樣。 (我懷疑這是什麼實際造成的錯誤。)時,您可以

避免字符串轉換 - 你只需要:

pa2.Value = DateTime.Now; 

或者可能:

pa2.Value = DateTime.UtcNow; 

注意,爲了方便,你可以做這全在一行:

cmd1.Parameters.Add("@DTime", SqlDbType.DateTime).Value = DateTime.Now; 
+0

哦,我的上帝!感謝Jon回答我。我完全明白了...... – androidrill

3

你的參數類型爲DateTime。使用DateTime參數而不是string

SqlParameter pa2 = new SqlParameter("@DTime", DbType.DateTime); 
pa2.Value = DateTime.Now; 
cmd1.Parameters.Add(pa2); 
+0

感謝您的答案,它完美的作品。 – androidrill

2

改變這一行

pa2.Value = DateTime.Now.ToString(); 

pa2.Value = DateTime.Now; 

要定義一個DateTime作爲其類型的參數,但你嘗試插入其中一個日期時間預計字符串。

作爲您的代碼的附註。所有初始化SqlDataAdapter並設置它的插入命令都是無用的,因爲你直接調用ExecuteNonQuery(你應該)。

我也建議周圍使用您的可支配對象的Using Statement

using(SqlConnection con = new SqlConnection(... connection string ....)) 
using(SqlCommand cmd = new SqlCommand(...command text...., con)) 
{ 
    con.Open(); 
    cmd.Parameters.Add(......); 
    cmd.ExecuteNonQuery(); 
} 
+0

謝謝,它完美的作品。 – androidrill

1

問題在這裏:

SqlParameter pa2 = new SqlParameter("@DTime", DbType.DateTime); 
pa2.Value = DateTime.Now.ToString(); 
cmd1.Parameters.Add(pa2); 

在第一行中,您將pa定義爲DateTime Object,但在下一行將此對象轉換爲字符串。

這是正確的代碼

SqlParameter pa2 = new SqlParameter("@DTime", DbType.DateTime); 
pa2.Value = DateTime.Now; 
cmd1.Parameters.Add(pa2);