2014-06-28 24 views
0

转换失败我想请一个帮助。当我想插入的DateTimePicker值进入我的表,但他没有可以插入,他告诉我一个消息从字符字符串 转换日期和/或时间时转换日期和/或时间从字符串C#

转换失败

你可以帮助我请!

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void add_Click(object sender, EventArgs e) 
    { 
     cmd.CommandText = "Insert into clients values (" + cintxt.Text + ", '" + nomtxt.Text + "', '" + prntxt.Text + "', '" + datenaiss.Value + "', '" + addtxt.Text + "', '" + teltxt.Text + "')"; 
     cnx.Open(); 
     cmd.ExecuteNonQuery(); 
     cnx.Close(); 
    } 
+1

这显然是你的列类型之一是日期时间添加和AddWithValue之间的区别的详细信息,并尝试插入它的特点(因为你的所有值都是'.Text',这就是为什么所有的都是字符串)。请使用[paramterized queries](http://codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)。这种字符串连接对于[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)攻击是开放的。 –

+2

使用带有正确数据类型的参数化查询传递参数 – Steve

+0

sql-server中的日期类型是日期,并且当我将日期类型更改为datetime时,相同的消息会显示我。 – user3002886

回答

5

试图插入记录的代码应该更改为使用参数化方法。

这可能是一个例子

private void add_Click(object sender, EventArgs e) 
{ 
    string commandText = @"Insert into clients values 
          (@id, @name, @prn, @datan, @addr, @tel)"; 

    using(SqlConnection cnx = new SqlConnection(connectionString)) 
    using(SqlCommand cmd = new SqlCommand(commandText, cnx) 
    { 
     cmd.Parameters.AddWithValue("@id", Convert.ToInt32(cintxt.Text)); 
     cmd.Parameters.AddWithValue("@name", nomtxt.Text); 
     cmd.Parameters.AddWithValue("@prn", prntxt.Text); 
     cmd.Parameters.AddWithValue("@datan", datenaiss.Value); 
     cmd.Parameters.AddWithValue("@addr", addtxt.Text); 
     cmd.Parameters.AddWithValue("@tel", teltxt.Text); 
     cnx.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
} 

在这段代码中我已经改变了一些东西。首先,连接和命令不再是全局变量,而只是本地的,并且被包含在使用语句中,以确保正确关闭和处置,如果出于任何原因代码抛出异常。

其次,命令文本不再是字符串的串联,而只是带参数占位符的单个字符串。连接字符串以构建命令文本实际上是一种不好的做法。 Sql注入黑客等待以这种方式构建的命令击中你的数据库,正如你已经看到的那样,底层数据表不理解一个表示日期是有效日期的字符串。

最后,命令参数集合中充满了命令文本占位符预期的每个字段的参数。请注意,通过这种方式,您可以构建传递值的数据类型的参数,而不仅仅是数据表字段所不期望的字符串。在您的实际情况当然,这是可能的,这些参数中的应改为完全匹配您的数据表字段(例如我不知道ID的第一个字段是一个整数或没有)

编辑按照要求通过下面的评论我还添加了一些方法AddWithValue的考虑。

虽然它很方便和富有表现力,但如果您的程序频繁调用此代码或数据库处于大量使用状态,则可能会出现问题。使用首选的方法是

cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = nomtxt.Text; 
..... 

See MSDN SqlParameterCollection.Add
和有关说明如下
How Data Access Code Affects Database Performance

+0

参数化查询使用Add方法代替AddWithValue的一个小建议。虽然它不方便,但它将避免SQL Server中的缓存膨胀,因为每个不同长度的字符串值都会导致不同的缓存条目。例如:“cmd.Parameters.Add(”@ id“,SqlDbType.Int).Value = Int32.Parse(cintxt.Text);” –

+0

当然是的(并且给出字符串参数的确切大小是一个很大的性能提升),但我希望为此保持简单。 – Steve

+0

请记住,DateTimePicker返回一个可为空的DateTime类型,因此使用“??”操作员确保顺利转换为参数。 RGDS, –

相关问题