dポイントプレゼントキャンペーン実施中!

初心者なので拙いところもありますが、よろしくお願いします。


(背景)
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)
の実行でエラーとなっています。


恐らく型の変換がうまくいっていないのだと思うのですが、
どのように解決していけばよいのか手詰まりになっています。


何かおかしいところがあればご教示いただけませんでしょうか。
または、調査すればいいポイントをアドバイスいただけると助かります。

A 回答 (1件)

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

この回答への補足

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のみにしています。

ちなみに画面への入力は、数字でも半角英数字でも試しましたがだめでした。

補足日時:2012/01/31 00:09
    • good
    • 0
この回答へのお礼

解決できました。

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

とするとうまくいきました。

気にかけてくださってありがとうございました。

お礼日時:2012/01/31 14:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!