0

私はSQLコマンドのパラメータ(昨日この概念について簡単に説明しましたが、理解できないかもしれません)と一般的なOOPにはまったく慣れていませんが、楽しんでいます:D

これが昨日の私の質問へのリンクです;) みんな本当に助けてくれましたが、今はアプリにこれを実装するのに苦労しています

私は実際に例として構築しました:

  • "btnInsert" をクリックすると、2 つのユーザー入力 "comboBoxEmployeeId" (selectedvalue は int) + "txtDuration" (値は 10 進数) を含むフォーム "formConnection.cs" を処理します: `

    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」

    public class sqlDbOperations { //接続文字列 //SqlConnection myConnection = new SqlConnection("ATLELAG786576\SQLEXPRESS;初期カタログ=TEST;統合セキュリティ=False;接続タイムアウト=30;ユーザー インスタンス=False;ユーザー ID=basicuser;パスワード=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のような「10進数」の値を入力しても、次のメッセージが表示されます:

System.FormatException: Le format de la chaîne d'entrée est が正しくありません。= "The input string format is not correct" → 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(String value) à 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)".....

  • DBには何も保存されません(値がフォームからオブジェクト「コントラクト」に転送されず、INSERTを実行するメソッドに転送されないかのように)、新しいレコードがありますが、すべて空です

私は何を間違っていますか?ご協力ありがとうございました!

ブライス

4

2 に答える 2

0

データベース内のdataTypeは何であるDurationかを確認してください。numeric(19,6) または、10進値を受け入れるデータ型である必要があります。

于 2012-12-06T12:58:05.467 に答える
0

値は実際には SQL コマンドに転送されません。クラス 'sqlDbOperations' で作成したクラス コントラクトのインスタンスは、btnInsert_Click で作成したものとは異なります。sqlDbOp.insertContract();また、btnInsert_Click で作成したものを 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();
}

そして、「入力文字列の形式が正しくありません」という例外について。こちらのリンクが参考になるかもしれません

于 2012-12-06T13:03:44.153 に答える