• 締切済み

画面から入力した値が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) の実行でエラーとなっています。 恐らく型の変換がうまくいっていないのだと思うのですが、 どのように解決していけばよいのか手詰まりになっています。 何かおかしいところがあればご教示いただけませんでしょうか。 または、調査すればいいポイントをアドバイスいただけると助かります。

みんなの回答

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

SQLServer側のテーブル構成を開示してください。

kamometray
質問者

お礼

解決できました。 param(i - 1) = New SqlParameter("@p" & i, col.ColumnName) という設定の方法がまずかったようです。 param(i - 1) = New SqlParameter() param(i - 1).ParameterName = "@p" & i param(i - 1).SourceColumn = col.ColumnName とするとうまくいきました。 気にかけてくださってありがとうございました。

kamometray
質問者

補足

bin-chan 様 失礼いたしました。 (書くかどうか少し悩んだのですが、やはり書いた方が良かったですね。。) CREATE TABLE ZAIKO_M ( vNengappi varchar(10) PRIMARY KEY, vJihunbyou varchar(8) PRIMARY KEY, vIPAddress varchar(30) PRIMARY KEY, cSouko char(4), cSyain char(4), fNyuuryoku char(1), cShouhin char(11), nsuuryou varchar(20) ) です。 本当はnumericやdatetame型の項目も設定したいのですが、 ひとまずcharとvarcharのみにしています。 ちなみに画面への入力は、数字でも半角英数字でも試しましたがだめでした。

関連するQ&A

  • 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 __________________________________________ __________________________________________

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

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 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

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

    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 どなたか原因のわかる方がいれば、宜しくお願いします。

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

    ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内で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です。

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

    <>&などを保存する方法をおしえてください。 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

  • <VB.NET>INSERT文でDBにデータを入れたい 

    プログラム初心者です。 ボタンを押したらtextboxの値がDBのテーブルに格納されて画面が閉じるという処理をしたいです。 そして他の画面でボタンを押すとINSERT済みのテーブルが出るという 処理をしようと思っています。 今のところは、他の画面でボタンを押してもINSERT済みのテーブルが でないという状態です。元のテーブルのデータはでます。 サンプルを見つけてやってみたのですが、思った結果がでません。 public sub botton1-click dim sql_insert as string dim cmd_insert as oledbcommand dim strconn as string = "provider = ~OLEDB4.0 = ~.mdb" DA = New oledbDataAdapter conn = New oledbconnection(strconn) sql_insert = "INSERT INTO A組(名前) VALUES(TextBox1.Text) cmd_insert = New oledbcommand(sql_insert,conn) DA.insertCommand = cmd_insert Me.colse end sub DataAdapterはdatasetを使わず直接DBに格納させるINSERTの時にでも 使うのでしょうか? 自分自身まだよく分かっていないので、正しいコードと処理の流れを 教えて欲しいです。 使っているのはaccess2000、VB.NET2003です。よろしくお願いします。

  • MYSQLについて教えてください!

    お世話になります。 VB.net+MYSQLで開発してます。 MYSQLで聞きたいことがあるのですが、 今やろうとしている処理が 配列の要素数分ループ処理でインサートしようとしています。 しかし書き方が悪いのか配列名(カウンタ)という記述だと Functionに見られてしまいます。 それならと配列の要素を変数に代入して INSERTには変数をあてているのですが 変数が展開されません。。。 PHPとかだと変数の前に「.$」をつけると出来ると書いてあったのですが VBにも特殊なルールがあるのでしょうか? 以上よろしくお願いします。 以下サンプルソースです。(接続等はぶいてますが接続はできてます) Dim a As String Dim sqlstr As String Dim sqlcommand As Odbc.OdbcCommand for i as Integer = 0 to uBound(data_array) '初期化 a = "" '変数に値を設定 a = data_array(i) 'SQL文字列の設定 sqlstr = "insert into test( col_1 )" + _ "values(a);" sqlcommand.CommandText = sqlstr sqlcommand.ExecuteNonQuery() next

  • AccessVBAでInputBoxの値をSQLに組み込むには

    AccessVBA超初心者です。 テーブル上の項目の受付日時をInputBoxよりGetして、 フラグが1であるものに一律その値をセットしたいと思っているのですが、なかなか上手くいきません。 おそらくSQLの中に直接パラメタを入れられないのだと思いますが、どうしていいかわかりません。 すみませんが、よろしくお願いいたします。 ----------------------------------------------- Public Sub cmd_1_Click() Dim cmdReset As New ADODB.Command Dim cmdResult As New ADODB.Command Dim strDate As String cmdReset.ActiveConnection = CurrentProject.Connection cmdResult.ActiveConnection = CurrentProject.Connection cmdReset.CommandText = "UPDATE テーブル SET 受付日時='';" cmdReset.Execute strDate = InputBox(prompt:="処理日付を入力して下さい。(yyyy/mm/dd)", Title:="処理日の入力") cmdResult.CommandText = "UPDATE テーブル SET 受付日時 = strDate WHERE フラグ='1' " cmdResult.Execute MsgBox "終了" End Sub ------------------------------------------

  • MySQLへのレコード追加

    VB6でMySQL4.1に接続して テーブル"table1"にレコードを追加したいんですけど MySQLには接続できるんですけど、新しいレコードを 追加できません。 エラーメッセージは  Unknown column 'ID'in'fieldlist' とでます。 教えてください。 Dim SQL As String Dim ID As Integer Dim name As String Dim cmd As ADODB.Command Set cmd = New ADODB.Command ID = Text1.Text name = Text2.Text SQL = "insert into table1(AID,Aname) values(ID,name) " cmd.ActiveConnection = cn cmd.CommandText = SQL cmd.Execute table1の内容は AID Aname ←フィールド名 -------------   1  suzuki 2 satou 3 takahasi みたいな感じです。

  • SQLで 全項目を追加したい

    ACCESS97を使用しています。 SQLを使用して、データの全件削除、全件追加を実施したいのです。 追加元(テーブルA)の項目と、追加先(テーブルB)の項目は同じです。 削除の方は下記の内容で上手くいきましたが 追加は実施できませんでした。 追加の時、*アスタリスクを使用する方法などないのでしょうか? Private Sub コマンド0_Click() Dim SQLstr As String Dim DB As Database Dim RS As Recordset Set DB = CurrentDb() SQLstr = "DELETE FROM テーブルB" DB.Execute SQLstr Set DB = Nothing SQLstr = "" SQLstr = "INSERT INTO テーブルB(*) VALUE (テーブルA*)" Set DB = CurrentDb() DB.Execute SQLstr Set DB = Nothing End Sub