OdbcParameterCollection принимает только объекты с ненулевым типом OdbcParameter. - PullRequest
1 голос
/ 25 января 2012

Точно так же, как в голове, я совершенно новичок во всей этой «кодирующей» штуке в целом, так что прости меня, если я не проясню себя, и просто дай мне знать, если я могу сказать тебе что-нибудь еще. Я гуглил в течение нескольких дней и не мог ничего найти, я не уверен, что это плохо с моей стороны, или просто потому, что я действительно новичок и не знал бы решения, если бы оно было прямо перед моим лицо.

Когда я иду, чтобы протестировать приложение (Visual Studio 2010), все отображается, и я могу ввести информацию в свои текстовые поля, но как только я нажимаю кнопку отправки, появляется эта ошибка:

"OdbcParameterCollection принимает только объекты, отличные от NULL, типа OdbcParameter. Имя параметра: значение"

и указывает на эту строку кода:

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 ]

1 голос
/ 25 января 2012

Вы получаете нулевую ссылку, потому что вы создали и установили размер 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();

}

Из редактирования вашего вопроса я вижу, что это код, который вы используете, и я так понимаю, вы все еще получаете ту же ошибку?Скорее всего, это означает, что одно из значений, добавляемых в коллекцию параметров, является нулевым.Если вы проверяете их с помощью отладчика, все ли они имеют установленные значения?

Правка, еще раз:

Есть еще одна ошибка, которую я пропустил раньше.Команда SQL, которую вы написали для ODBC, неправильно использует параметры, о чем свидетельствует новая ошибка.

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.

Используйте любой тип столбца (varchar, money и т. Д.), И если ваши переменные (eventspecialist и т. Д.)имеют неправильный тип, преобразуйте значения в правильный тип (как указано в ссылке) перед их добавлением.Например, cmd.Parameters.Add("@ATTENDANCE", OdbcType.Int).Value = Int32.Parse(attendance);.Обратите внимание, что Int32.Parse может выдать ошибку, если attendance не является строкой, представляющей целое число.Я предлагаю изменить сигнатуру метода, чтобы требовать правильные типы, а затем проверить и преобразовать их перед вызовом execution.Это позволит избежать ошибок преобразования типов в этом методе.Таким образом, если вы получаете здесь ошибку, вы знаете, что она связана с взаимодействием с БД, а не с неправильной настройкой команды.

1 голос
/ 25 января 2012

Ошибка в том, что вы определили массив (OdbcParameter[] pram = new OdbcParameter[19];).Но вы не инициализируете его элементы.

Глядя на ваш код, следующие строки в вашем коде не обязательны.

OdbcParameter[] pram = new OdbcParameter[19];

и

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

EDIT : я не использовал Odbc* классов в прошлом.
Глядя на специфичный пример здесь , ваше имя параметра должно быть таким жекак имя вашего столбца

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);

и т. д. для остальных параметров.

0 голосов
/ 25 января 2012
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;
0 голосов
/ 25 января 2012

зачем вы это делаете, если вы уже добавили параметры в объект команды.

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

нет необходимости делать это снова, а также изменить

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

таким образом.

0 голосов
/ 25 января 2012

Добавьте параметр с определенным значением, предполагая, что передаваемые значения не равны NULL, если они не указаны.

В зависимости от базы данных имена ваших параметров в запросе 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;

Я бы также рекомендовал использовать один из Native.Классы соединения с базой данных, где это применимо, System.Data.SqlClient, MySql.Data.Client или клиент Oracle.

...