- ベストアンサー
データの取り込み
VB6.0 SQLSERVER で開発しています。 EXCELにあるデータをSQLへ取り込みたいのですが 下記のようにすると取り込めるのですが EXCELに空白があるとエラーが出ます。 教えてください。 Dim strSQL As String Dim adoRsWork As ADODB.RecordSet Dim exl As Object Dim i As Integer Dim k As Long Dim mds As Boolean Dim rs As Variant Dim j As Integer Dim s As String Dim ct As Long Dim fno As Integer Dim fnm As String strSel1 = "SELECT" strSel1 = strSel1 & " A.品番" strSel1 = strSel1 & ",A.品名" strSel1 = strSel1 & ",A.倉番" strSel1 = strSel1 & ",A.数量" strFro1 = " FROM " strFro1 = strFro1 & " A_zaiko AS A" strSQL = strSel1 & " " & strFro1 Debug.Print (strSQL) Set adoRsWork = pbAdo.OpenRecordset(strSQL) Set exl = CreateObject("Excel.Sheet") mds = True fnm = "C:\Documents and Settings\デスクトップ\159.xls" j = adoRsWork.Fields.Count - 1 ReDim ctyp(j) As Boolean For i = 0 To j Select Case adoRsWork(i).Type Case 131, 139 ctyp(i) = True Case Else ctyp(i) = False End Select Next adoRsWork.Close Set exl = CreateObject("Excel.Application") exl.Application.Visible = True exl.Application.Workbooks.Open FileName:=fnm k = 1 If mds Then k = 2 End If gSvrADOActiveconnection.BeginTrans On Error Resume Next For k = k To 65536 s = "" If exl.Cells(k, 1) = "" Then Exit For For i = 0 To j If ctyp(i) Then s = s & "," & exl.Cells(k, i + 1) Else s = s & ",'" & exl.Cells(k, i + 1) & "'" End If Next s = Mid(s, 2) strSQL = "insert into " & strFro1 & " values (" & s & ")" pbAdo.OpenRecordset (strSQL) If Err <> 0 Then gSvrADOActiveconnection.RollbackTrans Close fno adoRsWork.Close MsgBox "更新エラー" & Chr(10) & Err & ": " & Error _ & Chr(10) & ct + 1 & " 件目に問題あり" _ & Chr(10) & strSQL End End If ct = ct + 1 Next gSvrADOActiveconnection.CommitTrans On Error GoTo 0 exl.Application.DisplayAlerts = False exl.Application.Quit adoRsWork.Close
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
strSQLの内容が、書きこめる場合は(1)、エラーの場合は(2)のようになっているはずです。 (2)のSQL文は、明らかに文法エラーです。 (1) 「・・・ values (1,'う','C-1',20)」 (2) 「・・・ values (1,'う','C-1',)」 セルが空欄の場合、データベース上も空欄にするのであれば (3) 「・・・ values (1,'う','C-1',NULL)」 のようにNullValueを示す文字列を入れる必要が有ります。 ※(3)はあくまで例なので、NullValueを示す文字列は想像です。 セルが空欄の場合、データベース上を0にするのであれば (4) 「・・・ values (1,'う','C-1',0)」 と成るように、 s = s & "," & IIF( len(trim(Cells(k, i+1)))=0, 0, exl.Cells(k, i+1) ) としてはどうでしょうか?
その他の回答 (3)
- NOBNNN
- ベストアンサー率50% (93/186)
デバッグでブレークポイントを pbAdo.OpenRecordset (strSQL) の部分にしかけ、エラーになった瞬間の StrSql の内容を Debug.print してください。 その結果をおしえてください。 たぶん、エラー項目の項目を調べてもし、長さが0 なら数値ゼロをセットすればOKだと思いますが len(trim(Cells(k, i + 1))) = 0 ならZero にすれば???
お礼
NOBNNNさんの指摘の通りでした。 解決しました。ありがとうございます。
- NOBNNN
- ベストアンサー率50% (93/186)
エラー箇所の項目のデータは SQL Server のTABLEの項目はどんな属性ですか Nverchar それとも数値? Nullvalue は許可? キー項目ですか? こういったことが大事です。 SQl SERVER ManagementStudio などのツールで直接 TAbleにデータを 書き込めますか? トランザクションのRoll Back を無効にしてどんなデータが途中まで 書き込まれていますか? レコードキーは重複したデータを書き込もうとしていませんか? Roll Back を無効にして Sql Serverのエラーの内容をエラーコードなどを手がかりにして 内容を教えてください。 またこれらとは別に SQL SERVER ManagementStudio のDTSツール エクスポート/インポート 機能では正常にとりこめますか? こんなところをチェックしてみてください。
補足
SQL Server のTABLEの項目はnumericです。 Nullvalue は許可です。キー項目ではありません。 SQl SERVER ManagementStudio などのツールで直接 TAbleにデータを 書き込めます。 例えば A品番 A品名 A倉番 A数量 1 あ A-1 10 2 い B-1 15 3 う C-1 とEXCELシートにデータがあります。 これを読み込むと 1行目2行目は書き込まれますが 3行目で','の近くに無効な構文があります。 となります。 もちろん A品番 A品名 A倉番 A数量 1 あ A-1 10 2 い B-1 15 3 う C-1 20 ならエラーも無く3行ともSQLへ書かれます。 SQL SERVER ManagementStudio のDTSツール エクスポート/インポート 機能では正常にとりこめますか? レコードキーは重複したデータを書き込もうとしていません。 よろしくお願いします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
列のデータを For で回すときに exl.Cells(k, i + 1) の値が Empty だったら、vbNull とか 0 をセットするようにしてみては? 試してないので見当違いならすみません。
補足
だめみたいです。 何も変わりません。
お礼
Hayashi_Trekさん。ありがとうございます。 ばっちりでした。 またわからないときはお願いします。