C# SQL 命令参数,将值从表单“传输”到对象再到方法
Posted
技术标签:
【中文标题】C# SQL 命令参数,将值从表单“传输”到对象再到方法【英文标题】:C# SQL Command parameters, "transport" values from form to object to method 【发布时间】:2012-12-06 12:35:54 【问题描述】:我对 SQL 命令参数完全陌生(我昨天已经简要解释了这个概念,可能不明白),一般来说是 OOP,但我喜欢它:D
Here is the link to my question from yesterday ;) 伙计们确实提供了帮助,但我现在很难在我的应用程序中实现这一点
我已经实际构建了一个例子:
表单“formConnection.cs”包含2个用户输入“comboBoxEmployeeId”(selectedvalue是一个int)+“txtDuration”(值是一个小数),点击“btnInsert”我处理这个: `
sqlDbOperations sqlDbOp = new sqlDbOperations();`
public void btnInsert_Click(object sender, EventArgs e)
//Create new contract
var contract = new contract
employeeId = Convert.ToInt32(this.comboBoxEmployeeName.SelectedValue),
duration = Convert.ToDecimal(this.txtDuration.Text)
;
//Insert command to Db
sqlDbOp.insertContract();
MessageBox.Show("Done");
类“contract.cs”
class contract
public int employeeId get; set;
public decimal duration get; set;
类“sqlDbOperations.cs”
公共类 sqlDbOperations //连接字符串 //SqlConnection myConnection = new SqlConnection("ATLELAG786576\SQLEXPRESS;Initial Catalog=TEST;Integrated Security=False;Connect Timeout=30;User Instance=False;User ID=basicuser;Password=basicpw"); SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["EngAdminSqlDbConnectionString"].ConnectionString);
//Connection open
//SqlConnection.Open() is a void function and does not return an error but throws an exception so remember to put it in a try/catch brace
//Rather than having the program explode in front of the user
public void openConnection()
//Connection open
try
myConnection.Open();
catch (Exception e)
Console.WriteLine(e.ToString());
MessageBox.Show(e.ToString());
//Connection close
//Try/catch because like SqlConnection.Open() it does not return errors but throws an exception instead
public void closeConnection()
try
myConnection.Close();
catch (Exception e)
Console.WriteLine(e.ToString());
contract contract = new contract();
public void insertContract()
//Open
openConnection();
//Command
SqlCommand myCommand = new SqlCommand("INSERT INTO tblContracts (EmployeeId, Duration) VALUES (@employeeId, @contractDuration)", myConnection);
//Get values from form
formConnection formInput = new formConnection();
//Add parameters
myCommand.Parameters.AddWithValue("@employeeId", contract.employeeId);
myCommand.Parameters.AddWithValue("@contractDuration", contract.duration);
//Execute
myCommand.ExecuteNonQuery();
//Close
closeConnection();
这可以不工作 - 当我在我的 txtDuration 文本框中输入一个像 2.7 这样的“十进制”值时,我仍然收到一条消息:
System.FormatException: Le format de la chaîne d'entrée est 不正确。 = "输入的字符串格式不正确" à System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) à System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt) à System.Convert.ToDecimal(字符串值) à SQLStatementParameters.formConnection.btnInsert_Click(Object sender, EventArgs e) dans D:\C#\Projects\SQLStatementParameters\SQLStatementParameters\formConnection.cs:ligne 26 à System.Windows.Forms.Control.OnClick(EventArgs e)".....
数据库中没有存储任何内容(好像值没有从表单传输到对象“合同”,然后传输到执行 INSERT 的方法),我有一条新记录,但它都是空的我做错了什么? 感谢您的帮助!
布莱斯
【问题讨论】:
【参考方案1】:这些值实际上并没有传输到您的 sql 命令中。您在“sqlDbOperations”类中创建的类合同实例与您在 btnInsert_Click 中创建的不同。您需要将在 btnInsert_Click 中创建的那个传输到 sqlDbOp.insertContract();
以插入 DB。
所以你可以这样做:
public void insertContract(contract con)
//Open
openConnection();
//Command
SqlCommand myCommand = new SqlCommand("INSERT INTO tblContracts (EmployeeId, Duration) VALUES (@employeeId, @contractDuration)", myConnection);
//Get values from form
formConnection formInput = new formConnection();
//Add parameters
myCommand.Parameters.AddWithValue("@employeeId", con.employeeId);
myCommand.Parameters.AddWithValue("@contractDuration", con.duration);
//Execute
myCommand.ExecuteNonQuery();
//Close
closeConnection();
对于异常'输入字符串格式不正确'。或许你可以参考这个link
【讨论】:
谢谢科林,这真的很清楚,我的问题已经解决了;)【参考方案2】:你的数据库中Duration
的dataType是什么,确保它应该是numeric(19,6)
或者数据类型应该是接受十进制值的
【讨论】:
以上是关于C# SQL 命令参数,将值从表单“传输”到对象再到方法的主要内容,如果未能解决你的问题,请参考以下文章
将值从 c# 传递到 actionscript 3 和跨域问题
将值从 Oracle 对象类型参数传递到 PLSQL 表类型参数