- 締切済み
画面から入力した値が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) の実行でエラーとなっています。 恐らく型の変換がうまくいっていないのだと思うのですが、 どのように解決していけばよいのか手詰まりになっています。 何かおかしいところがあればご教示いただけませんでしょうか。 または、調査すればいいポイントをアドバイスいただけると助かります。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- bin-chan
- ベストアンサー率33% (1403/4213)
SQLServer側のテーブル構成を開示してください。
お礼
解決できました。 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 とするとうまくいきました。 気にかけてくださってありがとうございました。
補足
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のみにしています。 ちなみに画面への入力は、数字でも半角英数字でも試しましたがだめでした。