2012-01-25 15 views
1

ちょっと頭がおかしくなりましたが、私はこの全体的な「コーディング」のことを一般的に新しくしています。私はあなたに何かを伝えることができるかどうかを知る。私は数日間グーグルで行っていて何も見つけられませんでしたが、それが自分のところで悪いのかどうか、あるいは私が本当に新しくて解決策がわからないということはわかりません。面。OdbcParameterCollectionはnull以外のOdbcParameter型オブジェクトのみを受け入れます

私はアプリケーション(Visual Studioの2010)をテストするために行くとき、すべてが現れると私は私のテキストボックスに情報を置くことができますが、私は提出を押すと、このエラーがポップアップ表示:

"The OdbcParameterCollection only accepts non-null OdbcParameter type objects. Parameter name: 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; 
     } 
    } 
} 
+0

どのデータベースサーバーでmysqlを使用していますか? – Devjosh

+0

SQL Server Native Client 10.0にODBCデータソースを使用しています。それがあなたが求めていたものなら? – Control

+0

なぜSqlClientを使用していませんか? http://msdn.microsoft.com/en-us/library/system.data.sqlclient.aspx http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx – Lloyd

答えて

1

pramのサイズを作成して設定しましたが、オブジェクトを追加していないため、null参照が取得されています。だから、あなたが持っているのは、ヌルでいっぱいの配列です。 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(); 

} 

あなたの質問の編集から、これはあなたが使用しているコードであり、私はあなたがまだ同じエラーを受けていると思いますか?これは、パラメータコレクションに追加する値の1つが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);です。 attendanceが整数を表す文字列でない場合、Int32.Parseはエラーをスローすることがあります。正しいシグネチャを要求するようにメソッドのシグネチャを変更し、executionの呼び出しの前に検証して変換することをお勧めします。これは、このメソッドの型変換エラーを回避します。そうすれば、ここでエラーが発生した場合、コマンドを正しく設定するのではなく、DBとのやりとりに関連することが分かります。

+0

それでは、(int i = 0; i Control

+0

はい、ループ全体を削除できます。あなたはpram配列に何も入れていないので、あなたはそれから何も取得しません、そして、それはヌル値がどこから来るかです。しかし、コマンド(cmd.Parameters.Add(...);およびcmd.Parameters ["xxx"]。Value = xxx;)に手動でパラメータを追加するので、それらを再度追加する必要はありません。また、OdbcParameter [] pram = new OdbcParameter [19]という行を削除することもできます。私は私の答えをより明確に編集しました。 –

+0

@ Kruce: 'OdbcParameter []'とそのすべての使用法を削除します。代わりに '.Value = x'を使用してください。 – abatishchev

0

は、あなたが渡している値を推定、定義された値でパラメータを追加指定されていないところ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; 

私はまた、適用、System.Data.SqlClientの、MySql.Data.ClientまたはOracleクライアントのネイティブデータベース接続クラスのいずれかを使用することをお勧めします。

+0

それでも同じエラーが発生します。 : – Control

+0

-1:nullパラメータのエラーを修正するにはどうすればいいですか? –

+0

これは唯一の正しい提案です – abatishchev

1

エラーは、配列(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 *クラスを使用しhave't。 特定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); 

というように残りのパラメータと同じでなければなりません。

0

なぜコマンドオブジェクトにパラメータを追加したのですか?

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

もう一度やるとも、このように

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

を変更するには、このの必要はありません。

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; 
関連する問題