将值插入数据库

时间:2011-06-25 09:09:50

标签: sql

private void BtnSave_Click(object sender, EventArgs e)
{
   using (SqlConnection sqlConn = new SqlConnection("Data Source=TANYA-PC;Initial Catalog=biore1;Integrated Security=True")) //or variable to it
   {
      string sqlQuery = @"INSERT INTO cottonpurchase VALUES(@slipno, @purchasedate, @farmercode, @farmername, @villagename, @basicprice, @weight, @totalamountbasic, @premium, @totalamountpremium, @totalamountpaid, @yeildestimates)";

      //NOTE: RENAME "MyTable" to your database table!!!!

      using (SqlCommand cmd = new SqlCommand(sqlQuery, sqlConn))
      {
         cmd.Parameters.Add("@slipno", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtSlipNo.Text)) ? int.Parse(TxtSlipNo.Text) : (object)DBNull.Value;
        cmd.Parameters.Add("@purchasedate", SqlDbType.DateTime).Value = monthCalendar1.SelectionStart; //date of selection!
      cmd.Parameters.Add("@farmercode", SqlDbType.Int).Value = Convert.ToInt32(TxtFarmerCode.Text);
      cmd.Parameters.Add("@farmername", SqlDbType.VarChar, 100).Value = TxtFarmerName.Text;
      cmd.Parameters.Add("@villagename", SqlDbType.VarChar, 100).Value = TxtVillageName.Text;
      cmd.Parameters.Add("@basicprice", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtBasicPrice.Text)) ? int.Parse(TxtBasicPrice.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@weight", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtWeight.Text)) ? int.Parse(TxtWeight.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@totalamountbasic", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtTotalAmountBasic.Text)) ? int.Parse(TxtTotalAmountBasic.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@premium", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtPremium.Text)) ? int.Parse(TxtPremium.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@totalamountpremium", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtTotalAmountPremium.Text)) ? int.Parse(TxtTotalAmountPremium.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@totalamountpaid", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtTotalAmountPaid.Text)) ? int.Parse(TxtTotalAmountPaid.Text) : (object)DBNull.Value;
      cmd.Parameters.Add("@yeildestimates", SqlDbType.Int).Value = (!String.IsNullOrEmpty(TxtYeildEstimates.Text)) ? int.Parse(TxtYeildEstimates.Text) : (object)DBNull.Value;

      sqlConn.Open();
      try
      {
        cmd.ExecuteNonQuery();
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
  }
}

当我执行此操作时,我收到一条错误消息:

  

输入字符串不正确   格式。

     

cmd.Parameters.Add( “@ farmercode”,   SqlDbType.Int).Value =   int.Parse(TxtFarmerCode.Text);

4 个答案:

答案 0 :(得分:2)

错误说得非常清楚 - 显然,您尝试转换为INT的文字实际上不是INT数字......

也许你需要做更多这样的事情:

int farmerCode = -1;

if(int.TryParse(TxtFarmerCode.Text.Trim(), out farmerCode)
{
    cmd.Parameters.Add("@farmercode", SqlDbType.Int).Value = farmerCode;
}
else
{
    cmd.Parameters.Add("@farmercode", SqlDbType.Int).Value = DBNull.Value;  // or whatever makes sense
}

这是防御性编程的基本原则 - 不仅假设转换将起作用 - 它可能不会!测试一下,使用int.TryParse,如果你的输入是一个数字,你需要处理它(传递NULL或其他一些机制 - 由你决定)< / p>

答案 1 :(得分:0)

TxtFarmerCode.Text不是有效的int

好:int.Parse("123")

不好:int.Parse("Not an int")

答案 2 :(得分:0)

中有什么价值
TxtFarmerCode.Text

根据SQL参数,它必须是一个整数。听起来你需要做一些输入验证,以确保它在传递给数据库之前是一个整数。

答案 3 :(得分:0)

您的错误与您的代码不符:

<强>代码

cmd.Parameters.Add("@farmercode", SqlDbType.Int).Value 
  = Convert.ToInt32(TxtFarmerCode.Text);

错误

cmd.Parameters.Add("@farmercode", SqlDbType.Int).Value 
   = int.Parse(TxtFarmerCode.Text);

除此之外,很明显TxtFarmerCode.Text不会转换为有效的int 确保在将值插入数据库之前测试您的有效值,这适用于所有范围有限的变量 显然并非所有的int对农民代码都有效,所以让用户列出有效的农民代码并让他从列表中选择一个。这样就不可能选择一个不正确的农民代码。

插入主键时出现疑似错误
您正在尝试插入新记录,如果slipno是您的主键,那么您不应该在此处允许null以外的值,如果您尝试将现有密钥插入到表格中一个错误,永远不会发生。
最好让数据库分配主键,因为这是万无一失的。

数据库规范化
为什么表格中有farmercodefarmername?农民代码不是农民的身份吗? 如果是这样,存储农民姓名也是重复信息 你应该将farmid存储在表中。然后,农民ID指向表farmers的主键,该表存储有关农民的名称和其他相关信息。

链接:
http://en.wikipedia.org/wiki/Database_normalization
http://databases.about.com/od/specificproducts/a/normalization.htm