OdbcParameterCollection仅接受非null的OdbcParameter类型对象

时间:2012-01-25 14:00:52

标签: c# .net exception-handling ado.net odbc

就像有点抬头一样,我对这整个“编码”事情都是全新的,所以请原谅我,如果我不清楚,只要告诉我是否可以告诉你任何事情。我已经谷歌搜索好几天了,找不到任何东西,我不确定这对我来说是不是很糟糕,或者只是因为我真的很新,如果它在我面前就不会知道解决方案面。

当我去测试应用程序(Visual Studio 2010)时,一切都显示出来,我可以在文本框中输入信息,但是一旦我按下提交,就会弹出这个错误:

  

“OdbcParameterCollection只接受非null的OdbcParameter类型对象。参数名称:value”

它指向这行代码:

cmd.Parameters.Add(pram[i]);

我不知道我是设置参数错误还是INSERT INTO语句错误或者是什么。如果需要,我也可以向您显示ASP.net代码。如果我能给你更多信息,请告诉我!先谢谢你了!

我的C#代码就是这样:

 private void execution(string eventspecialist, string phone, string phone2, string firstname, string lastname, string besttime, string companyname, string nonprofit, string requesteddate, string requestedtime, string attendance, string eventtype, string other, string leadsource, string notes, string catering, string bar, string damagedeposit, string dancefloor)
{


    OdbcConnection conn = new OdbcConnection(GetConnectionString());

    string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    try
    {
        conn.Open();
        OdbcCommand cmd = new OdbcCommand(sql, conn);

        cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;
        cmd.Parameters.Add("@CUST_PHONE1", OdbcType.NVarChar, 50).Value = phone;
        cmd.Parameters.Add("@CUST_PHONE2", OdbcType.NVarChar, 50).Value = phone2;
        cmd.Parameters.Add("@CUST_FNAME", OdbcType.NVarChar, 50).Value = firstname;
        cmd.Parameters.Add("@CUST_LNAME", OdbcType.NVarChar, 50).Value = lastname;
        cmd.Parameters.Add("@BEST_TIME", OdbcType.NVarChar, 50).Value = besttime;
        cmd.Parameters.Add("@COMPANY_NAME", OdbcType.NVarChar, 225).Value = companyname;
        cmd.Parameters.Add("@NONPROFIT", OdbcType.NVarChar, 1).Value = nonprofit;
        cmd.Parameters.Add("@REQ_DATE", OdbcType.NVarChar, 10).Value = requesteddate;
        cmd.Parameters.Add("@REQ_TIME", OdbcType.NVarChar, 20).Value = requestedtime;
        cmd.Parameters.Add("@ATTENDANCE", OdbcType.NVarChar, 50).Value = attendance;
        cmd.Parameters.Add("@EVENT_TYPE", OdbcType.NVarChar, 50).Value = eventtype;
        cmd.Parameters.Add("@OTHER_DESC", OdbcType.NVarChar, 225).Value = other;
        cmd.Parameters.Add("@LEAD_SOURCE", OdbcType.NVarChar, 50).Value = leadsource;
        cmd.Parameters.Add("@NOTES", OdbcType.NVarChar, 225).Value = notes;
        cmd.Parameters.Add("@CATERING", OdbcType.NVarChar, 1).Value = catering;
        cmd.Parameters.Add("@BAR", OdbcType.NVarChar, 1).Value = bar;
        cmd.Parameters.Add("@DAMAGE_DEPOSIT", OdbcType.NVarChar, 19).Value = damagedeposit;
        cmd.Parameters.Add("@DANCE_FLOOR", OdbcType.NVarChar, 19).Value = dancefloor;



        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
    }
    catch (System.Data.Odbc.OdbcException ex_msg)
    {

        string msg = "Error occured while inserting";
        msg += ex_msg.Message;
        throw new Exception(msg);
    }
    finally
    {

        conn.Close();
    }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void submit_Click(object sender, EventArgs e)
{
    execution(eventspecialist.Text, phone.Text, phone2.Text, firstname.Text, lastname.Text, besttime.SelectedItem.Text, companyname.Text, nonprofit.Text, requesteddate.Text, requestedtime.Text, attendance.Text, eventtype.SelectedItem.Text, other.Text, leadsource.SelectedItem.Text, notes.Text, catering.Text, bar.Text, damagedeposit.Text, dancefloor.SelectedItem.Text);

    conform.Visible = true;
    Control frm = this.FindControl("form1");
    foreach (Control ctrl in frm.Controls)
    {
        if (ctrl is TextBox)
        {
            ((TextBox)ctrl).Text = "";
        }
        else if (ctrl is CheckBox)
        {
            ((CheckBox)ctrl).Checked = false;
        }
        else if (ctrl is DropDownList)
        {
            ((DropDownList)ctrl).SelectedIndex = 0;
        }
    }
}

5 个答案:

答案 0 :(得分:1)

您已获得空引用,因为您已创建并设置pram的大小,但尚未向其添加任何对象。所以,你所拥有的是一个充满空值的数组。您似乎可以完全取消for循环和pram数组,因为您已经在循环外添加了cmd的参数。

以下代码是不必要的:

OdbcParameter[] pram = new OdbcParameter[19];

以及

for (int i = 0; i < pram.Length; i++)
{
    cmd.Parameters.Add(pram[i]);
}

此外,您应该以这种方式设置每个参数的值:

cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;

因此,您的try区块将如下所示:

try
{
    conn.Open();
    OdbcCommand cmd = new OdbcCommand(sql, conn);

    cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;
    cmd.Parameters.Add("@CUST_PHONE1", OdbcType.NVarChar, 50).Value = phone;
    cmd.Parameters.Add("@CUST_PHONE2", OdbcType.NVarChar, 50).Value = phone2;
    cmd.Parameters.Add("@CUST_FNAME", OdbcType.NVarChar, 50).Value = firstname;
    cmd.Parameters.Add("@CUST_LNAME", OdbcType.NVarChar, 50).Value = lastname;
    cmd.Parameters.Add("@BEST_TIME", OdbcType.NVarChar, 50).Value = besttime;
    cmd.Parameters.Add("@COMPANY_NAME", OdbcType.NVarChar, 225).Value = companyname;
    cmd.Parameters.Add("@NONPROFIT", OdbcType.NVarChar, 1).Value = nonprofit;
    cmd.Parameters.Add("@REQ_DATE", OdbcType.Date, 10).Value = requesteddate;
    cmd.Parameters.Add("@REQ_TIME", OdbcType.Time, 20).Value = requestedtime;
    cmd.Parameters.Add("@ATTENDANCE", OdbcType.NVarChar, 50).Value = attendance;
    cmd.Parameters.Add("@EVENT_TYPE", OdbcType.NVarChar, 50).Value = eventtype;
    cmd.Parameters.Add("@OTHER_DESC", OdbcType.NVarChar, 225).Value = other;
    cmd.Parameters.Add("@LEAD_SOURCE", OdbcType.NVarChar, 50).Value = leadsource;
    cmd.Parameters.Add("@NOTES", OdbcType.NVarChar, 225).Value = notes;
    cmd.Parameters.Add("@CATERING", OdbcType.NVarChar, 1).Value = catering;
    cmd.Parameters.Add("@BAR", OdbcType.NVarChar, 1).Value = bar;
    cmd.Parameters.Add("@DAMAGE_DEPOSIT", OdbcType.NVarChar, 19).Value = damagedeposit;
    cmd.Parameters.Add("@DANCE_FLOOR", OdbcType.NVarChar, 19).Value = dancefloor;

    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();

}

在您的问题编辑中,我发现这是您正在使用的代码,我认为您仍然遇到同样的错误?这很可能意味着您要添加到参数集合中的其中一个值为null。如果使用调试器检查它们,它们是否都设置了值?

再次编辑:

我之前错过了另一个错误。您为ODBC编写的SQL命令使用的参数不正确,如新错误所示。

string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor) 
VALUES (@SPECIALIST, @CUST_PHONE1, @CUST_PHONE2, @CUST_FNAME, @CUST_LNAME, @BEST_TIME, @COMPANY_NAME, @NONPROFIT, @REQ_DATE, @REQ_TIME, @ATTENDANCE, @EVENT_TYPE, @OTHER_DESC, @LEAD_SOURCE, @NOTES, @CATERING, @BAR, @DAMAGE_DEPOSIT, @DANCE_FLOOR)";

应该是:

string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

请注意,为了便于阅读,我打破了代码行。此外,您将参数添加到集合的顺序很重要。它们必须符合与列匹配的顺序(eventspecialist的值必须是第一个,phon秒的值等等。)也可能需要命名参数与列名相同,如@shahkalpesh所示。

ODBC命令使用?来访问参数,而不是像SQL命令那样访问参数名称。关于这个主题的几个链接:

http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx

http://msdn.microsoft.com/en-us/library/8dcw81x5.aspx

修改

我注意到您已将所有值传递给方法string。在添加参数时,您需要将这些转换为正确的类型,并使用正确的ODBC数据类型。有关ODBC参数类型,请参阅this link

使用列的任何类型(varcharmoney等),如果您的变量(eventspecialist等)的类型不正确,请将值转换为在添加之前更正类型(如链接中所示)。例如,cmd.Parameters.Add("@ATTENDANCE", OdbcType.Int).Value = Int32.Parse(attendance);。请注意,如果Int32.Parse不是表示整数的字符串,attendance可能会抛出错误。我建议更改方法签名以要求正确的类型,然后在调用execution之前验证并转换它们。这样可以避免此方法中的类型转换错误。这样,如果你在这里遇到错误,你知道它与数据库的交互有关,而不是错误地设置命令。

答案 1 :(得分:1)

错误是因为您已经定义了一个数组(OdbcParameter[] pram = new OdbcParameter[19];)。但是,你没有初始化它的元素。

查看代码,不需要代码中的以下行。

OdbcParameter[] pram = new OdbcParameter[19];

for (int i = 0; i < pram.Length; i++)
{
    cmd.Parameters.Add(pram[i]);
}

编辑:过去我没有使用Odbc *类 查看特定的示例here,您的参数名称应与列名相同

cmd.Parameters.Add("eventspecialist", OdbcType.NVarChar, 50);
cmd.Parameters.Add("phone", OdbcType.NVarChar, 50);
cmd.Parameters.Add("phone2", OdbcType.NVarChar, 50);
cmd.Parameters.Add("firstname", OdbcType.NVarChar, 50);
cmd.Parameters.Add("lastname", OdbcType.NVarChar, 50);
cmd.Parameters.Add("besttime", OdbcType.NVarChar, 50);

依此类推其他参数。

答案 2 :(得分:0)

使用定义的值添加参数,假设您传递的值不是未指定的值。

根据数据库的不同,yoru查询中的参数名称必须与OdbcParameters集合中定义的参数名称匹配,并且在某些情况下,请使用正确的顺序或应用程序。

根据您的更新,在您的查询中指定参数名称。

string sql = "INSERT INTO tblcontacts (eventspecialist, phone, phone2, firstname, lastname, besttime, companyname, nonprofit, requesteddate, requestedtime, attendance, eventtype, other, leadsource, notes, catering, bar, damagedeposit, dancefloor) VALUES (@EVENTSPECIALIST, @CUST_PHONE1, ETC ETC ETC)"; 


// Remove this code.
OdbcParameter[] pram = new OdbcParameter[19]; 

for (int i = 0; i < pram.Length; i++) 
    { 
        cmd.Parameters.Add(pram[i]); 
    } 


// Add your parameters with a value.
cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventSpecialist;

我还建议使用适用的本机数据库连接类之一,System.Data.SqlClient,MySql.Data.Client或Oracle客户端。

答案 3 :(得分:0)

如果已经在命令对象中添加了参数,为什么要这样做。

for (int i = 0; i < pram.Length; i++)
{
    cmd.Parameters.Add(pram[i]);
}

不需要再次这样做,也可以改变

string sql = "INSERT INTO tblcontacts (eventspecialist) VALUES (@SPECIALIST)"

以这种方式。

答案 4 :(得分:0)

cmd.Parameters.Add("@SPECIALIST", OdbcType.NVarChar, 50).Value = eventspecialist;
cmd.Parameters.Add("@CUST_PHONE1", OdbcType.NVarChar, 50).Value = phone;
cmd.Parameters.Add("@CUST_PHONE2", OdbcType.NVarChar, 50).Value = phone2;
cmd.Parameters.Add("@CUST_FNAME", OdbcType.NVarChar, 50).Value = firstname;
cmd.Parameters.Add("@CUST_LNAME", OdbcType.NVarChar, 50).Value = lastname;
cmd.Parameters.Add("@BEST_TIME", OdbcType.NVarChar, 50).Value = besttime;
cmd.Parameters.Add("@COMPANY_NAME", OdbcType.NVarChar, 225).Value = companyname;
cmd.Parameters.Add("@NONPROFIT", OdbcType.NVarChar, 1).Value = nonprofit;
cmd.Parameters.Add("@REQ_DATE", OdbcType.Date, 10).Value = requesteddate;
cmd.Parameters.Add("@REQ_TIME", OdbcType.Time, 20).Value = requestedtime;
cmd.Parameters.Add("@ATTENDANCE", OdbcType.NVarChar, 50).Value = attendance;
cmd.Parameters.Add("@EVENT_TYPE", OdbcType.NVarChar, 50).Value = eventtype;
cmd.Parameters.Add("@OTHER_DESC", OdbcType.NVarChar, 225).Value = other;
cmd.Parameters.Add("@LEAD_SOURCE", OdbcType.NVarChar, 50).Value = leadsource;
cmd.Parameters.Add("@NOTES", OdbcType.NVarChar, 225).Value = notes;
cmd.Parameters.Add("@CATERING", OdbcType.NVarChar, 1).Value = catering;
cmd.Parameters.Add("@BAR", OdbcType.NVarChar, 1).Value = bar;
cmd.Parameters.Add("@DAMAGE_DEPOSIT", OdbcType.NVarChar, 19).Value = damagedeposit;
cmd.Parameters.Add("@DANCE_FLOOR", OdbcType.NVarChar, 19).Value = dancefloor;