
初心者なので拙いところもありますが、よろしくお願いします。
(背景)
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件)
- 最新から表示
- 回答順に表示
No.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のみにしています。
ちなみに画面への入力は、数字でも半角英数字でも試しましたがだめでした。
解決できました。
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
とするとうまくいきました。
気にかけてくださってありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でaccdbファイルのテーブルの...
-
ACCESS テーブルに2行目から取...
-
Access2019でフォームから入力...
-
他ファイルのテーブルの情報を...
-
ASPからSQLserverへの重複デー...
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
ACCESS 複数テーブル・複数フィ...
-
異なるスキーマからデータを抽...
-
CLOB型へのINSERT
-
datapumpの実行方法について
-
INDEXの無効化
-
postgreSQLのint型は桁数指定が...
-
テーブル名を[]でくくらないと...
-
Data Pump で大量データインポ...
-
SQL*Loaderで、データを加工し...
-
検索結果の列数を動的に変更したい
-
Oracle複数の表をもとにmerge文...
-
INSERT文で発行したオートナン...
-
カラムの存在チェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルからアクセスにインポ...
-
ACCESS テーブルに2行目から取...
-
他ファイルのテーブルの情報を...
-
C#でaccdbファイルのテーブルの...
-
(ACCESS)複数mdbからのデータ...
-
アクセスマクロで、csv データ...
-
データ読込時のタイムアウト
-
mdb→csvへのエクスポートについて
-
Access2019でフォームから入力...
-
JSPでデータベース作成
-
テーブルのリンク(ACCESS)
-
VBAで データベースにデータを...
-
シーケンシャルアクセスについて
-
VBでCSVデータをMDB
-
ACCESSのリンクについて
-
Accessでボタンを押したらエク...
-
Accessの接続先をSQLサーバ...
-
jspのプログラムについて
-
アクセス初心者に注意点を教え...
-
画面から入力した値がDBに登録...
おすすめ情報