プロシージャまたは関数の引数が多すぎますのエラー

このQ&Aのポイント
  • プロシージャまたは関数の spTest の引数が多すぎます。
  • コードを実行するとエラーが発生し、プロシージャまたは関数の引数が多すぎます。
  • どこが悪いのか教えてください。
回答を見る
  • ベストアンサー

プロシージャまたは関数の引数が多すぎますのエラー

お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

Sub spTestの中で、cmdに毎回SqlParameterを足しているからでは。1回目のAddでパラメータ1個、2回目のAddでパラメータ2個になり、2回目がエラーになるのでしょう。

chibita_papa
質問者

お礼

xcrOSgS2wYさん、FENさん有難うございました。 >ソースだけだとよく分からないので、何をするプログラムなのかを明記した方がよろしいかと。 >Sub spTestの中で、cmdに毎回SqlParameterを足しているからでは。 >1回目のAddでパラメータ1個、2回目のAddでパラメータ2個になり、2回目>がエラーになるのでしょう。 実は、トランザクション処理がやりたかったのです。 これは、テストのストアドですが テキストファイルを読み込み全ての行を処理し終えた時にCommit 不正なデータがあった時は、Rollbackの予定でした。 が、ストアドを繰り返すと失敗するので調べておりました。 おっしゃるとおり .Parameters.Clear() を挿入して解決しました。 有難うございました

その他の回答 (1)

noname#118114
noname#118114
回答No.2

spTes内の「ExecuteNonQuery」が正常に完了していないのではないでしょうか? 後、ソースだけだとよく分からないので、何をするプログラムなのかを明記した方がよろしいかと。

関連するQ&A

  • ストアドプロシージャの実行について

    asp.net から sqlserver のストアドプロシージャを実行させる勉強をしています。 作成されているはずのストアドプロシージャを実行できずに困っています。 webformにテキストボックス、ボタン、データグリッドを貼り付け、ストアドプロシージャを作成し下記のプログラムを実行させるのですが上手くいきません。 (テキストボックスに任意で入力された数値のデータをボタンを押すと表示するものです) <エラー内容>→ ストアド プロシージャ 'proc1' が見つかりませんでした Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New SqlConnection Dim cmd As New SqlCommand cn.ConnectionString = "接続文字列" cmd.Connection = cn cmd.CommandText = "proc1" cmd.CommandType = System.Data.CommandType.StoredProcedure Dim p1 As SqlParameter = cmd.Parameters.Add("@param1", System.Data.SqlDbType.Int) p1.Value = TextBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader DataGrid2.DataSource = dr DataGrid2.DataBind() dr.Close() cn.Close() end sub ストアドproc1(場所:Northwind)の内容↓ CREATE procedure proc1 @param1 int as select * from products where categoryID=@param1 どなたか原因のわかる方がいれば、宜しくお願いします。

  • Insertできません

    どうしてもInsertできませんどこが間違っているのか教えてください。 Dim cn As New SqlConnection("workstation id=""ユーザー名?"";packet size=4096;user id=test;data source=server名;per" & _ "sist security info=True;initial catalog=テーブル名;Password=パスワード") Dim cmd As New SqlCommand("カラム1", cn) cmd.CommandType = CommandType.StoredProcedure 'cnst.CommandText = "INSERT INTO テーブル名(カラム1, カラム2, カラム3,カラム4) " & _ '"VALUES (@カラム1, @カラム2, @カラム3,@カラム4())" Dim p1 As SqlParameter = cmd.Parameters.Add("@カラム1", SqlDbType.VarChar, 20) p1.Value = TextBox1.Text Dim p2 As SqlParameter = cmd.Parameters.Add("@カラム2", SqlDbType.VarChar, 20) p2.Value = TextBox2.Text Dim p3 As SqlParameter = cmd.Parameters.Add("@カラム3", SqlDbType.VarChar, 20) p3.Value = Dropdownlist1.DataTextField Dim p4 As SqlParameter = cmd.Parameters.Add("@カラム4", SqlDbType.VarChar, 20) p4.Value = TextBox3.Text cn.Open() cmd.ExecuteNonQuery() cn.Close() SqlDataAdapter2.Fill(DataSet21) DataGrid1.DataBind() End Sub __________________________________________ __________________________________________

  • VB.Net SqlCommand 共通に

    お世話になります。 VB.Net 駆け出しの者です。 SqlCommand を使いストアドプロシジャーを実行して戻り値を DateSet にするような関数はプログラムを作っていくと、かなり多数になるようになりました。接続文字列だったり、いろいろ同じような記述が続いているなと思っておりました。 そこで、以下のような関数を作り、この部分を使いまわせないものかと思っております。 ストアドプロシジャーの名前や、そのほか必要な部分の文字はすべて変数にして、なんとか使えないのかなと思っているのですが、問題なのは、パラメータの部分でうまくいかないのです。 パラメータの部分だけ別関数にして、なんとかねじこめないかなと思っているのですが・・・ そもそもこういうやり方が正しいのかどうかもわからないのですが、その辺りも含めご教授いただければ幸いでございます。 何卒よろしくお願いいたします。 Public Function CommonDataSet(ByVal NameStored As String, ByVal CMDPara As SqlCommand, ByVal BasicTableName As String, ByVal ErrStr As String, ByVal ErrStrCaption As String) As DataSet     Dim SQLCon As SqlConnection = New SqlConnection(CMO.GetConnectStrings())     Try       CMDPara = New SqlCommand(NameStored, SQLCon)       CMDPara.CommandType = CommandType.StoredProcedure       SQLCon.Open()       Dim custDA As SqlDataAdapter = New SqlDataAdapter       Dim custDS As DataSet = New DataSet       ’この部分で下記の関数でパラメータを設定したいのですが、うまくいきません       custDA.SelectCommand = CMDPara       custDA.Fill(custDS, BasicTableName)       CommonDataSet = custDS     Catch ex As Exception       Err.Raise(Err.Number)       MessageBox.Show(ErrStr, ErrStrCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)       CommonDataSet = Nothing     End Try     If SQLCon.State <> ConnectionState.Closed Then       SQLCon.Close()       SQLCon.Dispose()     End If End Function パラメータを設定する関数 上の関数の引数として設定したいのです  ByVal CMDPara As SqlCommand の部分のパラメータとして Private Function CommonPara(CMD As SqlCommand) As SqlCommand     CMD.Parameters.Clear()     CMD.Parameters.Add(New SqlParameter(パラメータ1の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ2の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ3の記述)     CommonPara = CMD End Function

  • Oracleへの接続について

    OS:WindowsWp 言語:Visual Studio 2005 Visual Basic データベース:Oracle10g ご教授願います。 1つのクラスでデータベースへの接続メソッド・SQL文発行メソッド、切断メソッドを実装し、それらを状況に応じて呼び出し、データの取得を行いたいと考えております。 以下、ソースです。 --------クラスここから Public Class ConnectOracle  Public myConnection as New OracleConnection  Public Sub ConnectDB()・・・(1)   myConnection.ConnectionString = "User ID=scott;Password=tiger;Data Source=orcl"   myConnection.Open()  End Sub  Public Sub SqlDB()・・・(2)   Dim cmd As OracleCommand = New OracleCommand("SELECT * FROM EMP")   cmd.Connection = myConnection   cmd.CommandType = CommandType.Text   Dim reader As OracleDataReader = cmd.ExecuteReader()   ・・・・  End Sub  Public Sub DisConnectDB()・・・(3)   myConnection.Close()  End Sub --------クラスここまで Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  Dim Conn As New ConnectOracle・・・上記のクラス  Conn.ConnectDB()・・・(4)  Conn.SqlDB()・・・(5)  Conn.DisConnectDB()・・・(6) End Sub (4)実行でOracleに接続が行われ、クローズしていないのに、(5)を実行したときにはデータベースへの接続が切断されました。実装方法がおかしいでしょうか?

  • Disposeの動き

    VB2010でプログラム開発を行っています。 VB2010は初心者で、インターネットを使って調べながら構築していますので、ほとんど意味を理解していない状態です。 この度下記の文を書いたのですが、Point1で「Cmd.Dispose() 」を入れないとPoint2で「OleDbException が発生しました エラーを特定できません」のエラーになってしまいます。 そこで2つの疑問が出てきたので教えていただけないでしょうか。 疑問1: なぜ、Point1でDisposeしないとエラーになってしまうのか。 疑問2: Point1でDisposeすると、内容が破棄されると思っていたのですが、そのまま処理が進むようです。 なぜ、再度「Dim Cmd As New OleDbCommand」の宣言が必要無く、トランザクションも続いているのでしょうか。 また、よりスマートな書き方があればご教授いただけるとありがたいです。 よろしくお願いします。 Module Module1   Public Con As New OleDbConnection   Public Cmd As New OleDbCommand   Public bTrans As OleDb.OleDbTransaction   Public sb As New System.Text.StringBuilder() End Module Private Sub Btn_Kanryo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Kanryo.Click   Dim ExResult AS Integer        '新規トランザクションの開始。        bTrans = Con.BeginTransaction        'コマンドオブジェクトにトランザクション関連付け        Cmd.Transaction = bTrans        'DB更新1        sb = New System.Text.StringBuilder        sb.AppendLine("UPDATE A ")        sb.AppendLine("SET")        sb.AppendLine(" A_AA = '1'")        sb.AppendLine(" WHERE")        sb.AppendLine(" A_BB='123'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString        ExResult = Cmd.ExecuteNonQuery()        'ストアドプロシージャ―処理        Cmd.Connection = Con        Cmd.CommandType = CommandType.StoredProcedure        Cmd.CommandText = "AAA.ABC"        Dim outPara As New OleDbParameter("ERR_FLG", OleDbType.Decimal)        outPara.Direction = ParameterDirection.Output        Cmd.Parameters.Add(outPara)        Cmd.ExecuteNonQuery() Point1⇒ Cmd.Dispose()        'DB更新2        sb = New System.Text.StringBuilder        sb.AppendLine("DELETE ")        sb.AppendLine(" B")        sb.AppendLine(" WHERE ")        sb.AppendLine(" B_AA='1'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString Point2⇒ ExResult = Cmd.ExecuteNonQuery()        bTrans.Commit() End Sub

  • <>&などを保存する方法をおしえてください。

    <>&などを保存する方法をおしえてください。 NameTextBox CommentTextBox 保存ボタン があり保存ボタンを押すと 下記コードが実行されるようにしました。 これで、保存はできるようになったのですが <>&などを使用するとエラーとなってしまします。 <>&を使用するにはどのようにしたらいいのでしょうか? 教えてください。 Dim strSQL As String = "INSERT INTO tableA (Name,Comment) VALUES (@Name,@Comment)" Using con As New SqlConnection(conStr) Dim command As New SqlCommand(strSQL, con) con.Open() Using cmd1 As SqlDataReader = con.CreateCommand() cmd1.CommandType = CommandType.Text Try with cmd1 .Parameters.Add("@Name", SqlDbType.NVarChar) .Parameters.Add("@Comment", SqlDbType.NVarChar) .Parameters("@Name").Value = NameTextBox .Parameters("@Comment").Value = CommentTextBox End With cmd1.CommandText = strSQL cmd1.ExecuteNonQuery() Catch er As Exception Finally con.Close() Catch ex As Exception Finally con.Close() End Try End Using End Using

  • ストアドプロシージャの戻り値が取得できない

    ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのです。 ついでにSelectとした複数行の結果の読み込みもしたいのですが。 Dim cmd As New System.Data.SqlClient.SqlCommand Dim i As Integer Dim readerA As System.Data.SqlClient.SqlDataReader cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("A", System.Data.SqlDbType.Int) cmd.Parameters("A").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() i = cmd.Parameters("A").Value if (i = 0) Then 処理 End If While readerA.Read() 処理 End While 上記でSelectした結果をreaderA("カラム名") で読みこめているのですが、戻り値Aの値が取得できていません。 ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。 ちなみに、違うストアドを実行しているところでは戻り値は取得できています。。。 ストアドがおかしいんでしょうか。Selectの取得結果も見ようとしているのがまずいのでしょうか。 環境はvb.net、SQLServer2005です。

  • VB2010からPROCEDUREを実行でエラー

    VB2010を使っています。 Oracleのプロシージャを呼び出しするのですが、 以下のエラーが出て困っています。 ORA-06550:行1、列7: PLS-00801:内部エラー[22503] ORA-06550:行1、列7: PL/SQL:Statement ignored 実際のPG Public Function ORA_EXECUTE(ByVal strSQL As String) As Boolean ' データ格納領域の初期化 Dim v_return_flg As Boolean Dim Ora_Cnn_bk As OracleConnection Dim Ora_Cmd_bk As OracleCommand ' Oracle接続情報の初期化 Ora_Cnn_bk = New OracleConnection Ora_Cmd_bk = New OracleCommand ' Oracleへのコネクションの確立 Ora_Cnn_bk.ConnectionString = "User Id=(ユーザ名); Password=(パスワード); Data Source=(接続文字列)" & "; Pooling=false" Ora_Cnn_bk.Open() v_return_flg = False Try Dim oTYPE_CHAR As OracleDbType = OracleDbType.Char Dim oPARM_OUTPUT = ParameterDirection.Output 'バインド変数のセット Ora_Cmd_bk.Parameters.Add("AAA", oTYPE_CHAR) Ora_Cmd_bk.Parameters("AAA").Value = " " Ora_Cmd_bk.Parameters("AAA").Direction = oPARM_OUTPUT Ora_Cmd_bk.Parameters("AAA").OracleDbType = oTYPE_CHAR 'ストアドプロシージャ実行 Ora_Cmd_bk.CommandType = CommandType.StoredProcedure Ora_Cmd_bk.CommandText = strSQL Ora_Cmd_bk.Connection = Ora_Cnn_bk Ora_Cmd_bk.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("SQL(" + strSQL + ")" + Chr(13) + ex.Message, "確認", MessageBoxButtons.OK) Finally ' コネクションを閉じる Ora_Cnn_bk.Close() ' Oracle接続情報のクリア Ora_Cnn_bk = Nothing Ora_Cmd_bk = Nothing End Try ' データ返却 Return v_return_flg End Function Oracle側のプロシージャは、別PGで使用していて C++からアクセスし使える状態です。 お分かりになる方教えてください。 m(_ _)m

  • 画面から入力した値がDBに登録できない

    初心者なので拙いところもありますが、よろしくお願いします。 (背景) VB.net(VB2010)で作成した画面で入力したデータを DB(SQLserver2003)に取り込もうとしています。 画面は任意のテーブルを指定でき、(プルダウンで選択します) 指定されたテーブル名からテーブル・カラムの情報を取得し、画面に一覧表示します。 一番下の行にデータを手動で追加することができるようにしたいと思っています。 任意のテーブルを指定できるようにしているため、 動SQLを作成しています。 動的SQL文作成のファンクションは下記の通りになります。 '***************start Private Function CreateInsertCommand(ByVal dt As DataTable) As SqlCommand 'dtには画面から入力された情報と、 'Insert先のテーブルやカラムの情報が設定されています。 Dim cmd As New SqlCommand Dim SqlStr As String Dim i As Integer cmd.CommandText = "INSERT INTO " & dt.TableName & " VALUES (" 'パラメータを配列で定義 Dim param(dt.Columns.Count - 1) As SqlParameter i = 1 SqlStr = "" For Each col As DataColumn In dt.Columns SqlStr = SqlStr & "@p" & i & ", " param(i - 1) = New SqlParameter("@p" & i, col.ColumnName) If col.DataType Is System.Type.GetType("System.String") Then param(i - 1).SqlDbType = SqlDbType.VarChar Else param(i - 1).SqlDbType = SqlDbType.Int End If param(i - 1).SourceVersion = DataRowVersion.Original cmd.Parameters.Add(param(i - 1)) '追加 iをカウントアップ i = i + 1 Next ' 最後に付加したカンマを破棄 cmd.CommandText = cmd.CommandText & Left(SqlStr, Len(SqlStr) - 2) & ")" cmd.Connection = cnt CreateInsertCommand = cmd End Function '***************end 呼び出し元のは下記の通り記述されています。 '***************start2 Dim oSqlAdap As New SqlDataAdapter("SELECT * FROM " & dt.TableName, cnt) Try '各種コマンドを登録します oSqlAdap.InsertCommand = CreateInsertCommand(dt) oSqlAdap.Update(dt) Catch ex As Exception MsgBox("更新失敗" & vbCrLf & ex.ToString) End Try '***************end2 データを追加するテーブルはVarcharとCharのみで構成されるテーブルを使っています。 (問題点・質問内容) 画面から全カラムに値を設定して登録しようとすると、 「文字列データまたはバイナリ データが切り捨てられます。 ステートメントは終了されました。」のエラーが表示されます。 デバッグして追っていくと、 >oSqlAdap.Update(dt) の実行でエラーとなっています。 恐らく型の変換がうまくいっていないのだと思うのですが、 どのように解決していけばよいのか手詰まりになっています。 何かおかしいところがあればご教示いただけませんでしょうか。 または、調査すればいいポイントをアドバイスいただけると助かります。

  • Functionプロシージャの便利さがわかりません

    私はVBAコードを作る時は、もっぱらsubプロシージャーを使ってしまうのですが、 http://excelvba.pc-users.net/fol5/5_4.html を参考に、 Functionプロシージャとsubプロシージャの違いを確認してみたのですが、 Functionプロシージャの便利さがわかりません。 *********************************** Sub Test() SubプロシージャとFunctionプロシージャのテスト i = 1 Call Subプロシージャ(i) i = Functionプロシージャ(i) MsgBox "Functionプロシージャ結果:" + CStr(i) End Sub Sub Subプロシージャ(ByVal i As Integer) MsgBox "Subプロシージャ結果:" + CStr(i) End Sub Function Functionプロシージャ(ByVal i As Integer) As Integer i = i + 1 Functionプロシージャ = i End Function *********************************** Functionプロシージャは、 (ByVal i As Integer) As Integer のように、、二回もデータ型(Integer)の指定をしなくてはいけないのでしょうか? リンク先の説明には、 「SubプロシージャとFunctionプロシージャの違いは Subプロシージャが引数を受け取るのみに対して Functionプロシージャは引数を受け取り、 戻り値を返すという関数としての役割を果たすことができる点です。」 と記載されてますが、 それはSubプロシージャでも出来てますよね? サンプルコードにおいてのFunctionプロシージャの便利さを教えてください。

専門家に質問してみよう