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 命令参数,将值从表单“传输”到对象再到方法的主要内容,如果未能解决你的问题,请参考以下文章

将值从一个 DataGridView 复制到另一个

将值从 c# 传递到 actionscript 3 和跨域问题

将值从 bash 反向传输到 LO 宏

将值从 Oracle 对象类型参数传递到 PLSQL 表类型参数

如何将值从 javascript 传递到嵌入式 flex 对象?

将值从表单存储到网格