none
高手帮忙检查代码,错误“参数@szym没有默认值” RRS feed

  • 问题

  • 代码:

    string sql = "";
    sql = "insert into tmb(tm,zjmc,tmlx,daa,dab,dac,zqda,szym) values(@tm,@zjmc,@tmlx,@daa,@dab,@dac,@zqda,@szym)";
    OleDbConnection cn = new OleDbConnection(@"provider = microsoft.jet.oledb.4.0; data source = " + frm_main.pub_datapath + ";jet oledb:database password=" + frm_main.pub_datapwd);
    OleDbCommand cmd = new OleDbCommand(sql, cn);
    cn.Open();
    cmd.Parameters.Add("@daa", OleDbType.Char);
    cmd.Parameters["@daa"].Value = txt_daa.Text;
    cmd.Parameters.Add("@dab", OleDbType.Char);
    cmd.Parameters["@dab"].Value = txt_dab.Text;
    cmd.Parameters.Add("@dac", OleDbType.Char);
    cmd.Parameters["@dac"].Value = txt_dac.Text;
    cmd.Parameters.Add("@tmlx", OleDbType.Char);
    cmd.Parameters["@tmlx"].Value = "1";
    cmd.Parameters.Add("@tm", OleDbType.Char);
    cmd.Parameters["@tm"].Value = textBox1.Text;
    cmd.Parameters.Add("@zjmc", OleDbType.Char);
    cmd.Parameters["@zjmc"].Value = comboBox2.SelectedItem.ToString().Substring(0, 3);
    cmd.Parameters.Add("@szym", OleDbType.Char);
    cmd.Parameters["@szym"].Value = textBox2.Text;
    cmd.Parameters.Add("@zqda", OleDbType.Char);
    cmd.Parameters["@zqda"].Value = "z";
    cmd.ExecuteNonQuery();//执行到这里出错!“参数@szym没有默认值”
    cn.Close();

    下图是数据库:

    执行到最后提示“参数@szym没有默认值”是怎么回事?


    C#初学者!~~~

    2012年5月11日 15:27

答案

  • 您好,

    您新增参数顺序要与的SQL宣告的相同哦!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月11日 15:49
  • 补充:

    你既然使用Access,那么:

    1)请把OleDbType.Char改成VarWChar

    2)然后把参数添加的顺序和你SQL语句中的参数顺序保持一致。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月12日 5:49
    版主
  • 1)char:定长的字符串(比如长度是10,那么如果输入的字符串实际个数小于10,那么末尾会空格补充;且2个(英文)字符=一个汉字,长度“10”是英文字符的总个数)。

    varwchar:变长Unicode字符串(一个字符=一个汉字),因此定义的长度等于实际最大的长度;并且因为是Unicode,因此如果实际长度小于定义的长度,末尾不会产生空格)。

    2)依次判断吧:

    string insertStatement = "insert into(";
    string parameters = "values(";
    List<OleDbParameter> oleparameters = new List<OleDbParameter>();
    
    OleDbCommand cmd = new OleDbCommand ();
    
    if(CheckBox1.Checked)
    {
      insertStatement+="字段1";
      parameters+="@字段1";
      oleparameters.Add(new OleDbParameter{ParameterName="@字段1",Value=TextBox1.Text);
    }
    
    if(CheckBox2.Checked)
    {
      insertStatement+=",字段2";
      parameters+=",@字段2";
      oleparameters.Add(new OleDbParameter{ParameterName="@字段1",Value=TextBox2.Text);
    }
    ………………
    
    insertStatement+=")";
    parameters+=")";
    
    cmd.CommandText=insertStatement+parameters;
    foreach(OledbParameter p in oleparameters)
    {
       cmd.Parameters.Add(p);
    }
    
    cmd.ExecuteNonQuery();
    …………

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月13日 1:00
    版主

全部回复

  • 您好,

    您新增参数顺序要与的SQL宣告的相同哦!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月11日 15:49
  • 补充:

    你既然使用Access,那么:

    1)请把OleDbType.Char改成VarWChar

    2)然后把参数添加的顺序和你SQL语句中的参数顺序保持一致。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月12日 5:49
    版主
  • 我调整了顺序还是不行,倒数第二个参数没有默认值,之前也是倒数第二个。

    另外,CHAR与VARWCHAR有什么区别?


    C#初学者!~~~

    2012年5月12日 23:09
  • 问题解决了,倒数第二个真的是没有获得参数。还个两个问题,麻烦高手回答一下,谢谢:

    1)CHAR与VARWCHAR有什么区别?

    2)如下图,这是一个答案选择,有单选,有多选,当我点提交按钮的时候,如何把我当前选中的checkbox后面的textbox中的内容写入数据库,做为正确答案。这些控件都在一个panel里


    C#初学者!~~~

    2012年5月12日 23:28
  • 1)char:定长的字符串(比如长度是10,那么如果输入的字符串实际个数小于10,那么末尾会空格补充;且2个(英文)字符=一个汉字,长度“10”是英文字符的总个数)。

    varwchar:变长Unicode字符串(一个字符=一个汉字),因此定义的长度等于实际最大的长度;并且因为是Unicode,因此如果实际长度小于定义的长度,末尾不会产生空格)。

    2)依次判断吧:

    string insertStatement = "insert into(";
    string parameters = "values(";
    List<OleDbParameter> oleparameters = new List<OleDbParameter>();
    
    OleDbCommand cmd = new OleDbCommand ();
    
    if(CheckBox1.Checked)
    {
      insertStatement+="字段1";
      parameters+="@字段1";
      oleparameters.Add(new OleDbParameter{ParameterName="@字段1",Value=TextBox1.Text);
    }
    
    if(CheckBox2.Checked)
    {
      insertStatement+=",字段2";
      parameters+=",@字段2";
      oleparameters.Add(new OleDbParameter{ParameterName="@字段1",Value=TextBox2.Text);
    }
    ………………
    
    insertStatement+=")";
    parameters+=")";
    
    cmd.CommandText=insertStatement+parameters;
    foreach(OledbParameter p in oleparameters)
    {
       cmd.Parameters.Add(p);
    }
    
    cmd.ExecuteNonQuery();
    …………

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 呆oO 2012年5月13日 7:16
    2012年5月13日 1:00
    版主