• ベストアンサー

SQLSERVERのINSERT文について

VB2005 SQLSERVER EXPRESS 2005 上記環境で、データベースの追加作業をしています。 大量データ(1万件ほど)をINSERTしたときに、 下記エラーが途中で表示されます。エラー表示まではINSERTできています。 途中からまた開始すると、ある程度INSERTされて、エラー表示されます。 サーバーへの接続を確立しているときにエラーが発生しました。 SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: TCP プロバイダ, error: 0 - 通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。) <ソース> For Each Row In Table.Rows --省略-- SqlStr = "INSERT INTO テーブル VALUES (Row("フィールドA")" SqlCmd.CommandText = SqlStr Cn.Open() SqlCmd.ExecuteNonQuery() Cn.Close() Next フィールドは50ほどです。文法のエラーはないと思います。 接続と切断を繰り返すとリソース不足でエラーになるのでしょうか? ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

エラー原因の特定はできませんが、 毎回、Open、Closeする理由はあるのでしょうか? 理由がなければ、 Cn.Open() For Each Row In Table.Rows --省略-- SqlStr = "INSERT INTO テーブル VALUES (Row("フィールドA")" SqlCmd.CommandText = SqlStr SqlCmd.ExecuteNonQuery() Next Cn.Close() してみるとか・・・ または、SqlBulkCopyを利用してみるとか・・・

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#60992
noname#60992
回答No.2

通常50回程度でクライアントのリソース不足になることは考えられません。  メッセージ内容からして、サーバー側が時間内にコネクションを開く要求にこたえられていないのだと思います。 原因は良くわかりませんが、解決法としてはNo1のおっしゃる通りだと思います。 エラーの原因を突き止めたいなら、何回目でエラーが起きるのか、 それは毎回同じ回数なのか、あたりからはじめると思います。

AS400VBNET
質問者

補足

皆様方のお早いお返事ありがとうございます。 OpenCloseはループの外に設定しています。記入間違いです。 申し訳ありません。 省略してありますが、DataRowStateの値で追加、更新、削除の3つの コマンドをループしています。 毎回違うのですが、4、5000件のデータの時点でエラーになります。 サンプルデータは毎回違うものを使用しています(エラーの続きから) ので、データやテーブル設計は問題ないと思いますが、、、

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB2005でINSERT文が。。。

    こんにちわ、VB2005初心者でいつもお世話になってます。 単純なINSERT文「コンマ、')'、または有効な式の継続文字が必要です」のエラーです。記述のどこが間違いなのかご指摘いただけますでしょうか。 DataGridViewにAテーブル(MDB、5フィールド)データを表示して新規入力されたデータ(行)をAテーブルに追加しようとしています。これはデータソース追加でのクエリーではなくPG内に記述しています。 「values("& dTbl.Rows(i)(0)","」の「","」がエラーとなっています。 If dTbl.Rows(i).RowState = DataRowState.Added Then Try dCom = New OleDb.OleDbCommand( _ "INSERT INTO Aテーブル values("& dTbl.Rows(i)(0)","& dTbl.Rows(i)(1)"," _ & dTbl.Rows(i)(2)"," & dTbl.Row(i)(3)"," & dTbl"." & Row(i)(4)", cn) dCom.ExecuteNonQuery() cn.Close() MsgBox(dCom) MessageBox.Show("追加しました。", "通知") Catch ex As Exception cn.Close() MessageBox.Show(ex.Message) End Try End If よろしくお願いいたします。

  • SqlServer2008について

    WinServer2008にインストールされたSQLServer2008にクライアントから、sqlcmdコマンドでログインするとリモート接続が許可されてないのかログインできません。 別のWin2000ServerのSQL2005にはログインできます。 SQL2005には、セキュリティ構成というツールで、リモート接続を許可することができます。 SQL2008には、これに該当するツールが見当たりません。 ManagementStudioでSQL2008に接続して、データベースのプロパティの 「接続」を見ると、リモート接続を有効にするチェックは入ってますが、これは、SQL2005にもあり、sqlcmdで接続しようとすることと 関係ないように思いました。 sqlcmdでクライアントからSQL2008に接続するために、リモート接続するには、どうしたらよいのでしょうか? win2008サーバー上で、sqlcmdコマンドを使えば接続できます。

  • 副問合せをいれたINSERT文で、問合せ結果が無い場合

    副問合せをいれたINSERT文で、問合せ結果が無い場合 環境はSQL Server2005です。 テーブルA,テーブルBが存在し、テーブルAにレコード追加する際に一部をテーブルBから抽出して、 INSERTしようとしています。 [SQL文]  INSERT INTO テーブルA(フィールド1, フィールド2, フィールド3,フィールド4・・・)   SELECT 'AAA', 'BBB' ,B.フィールド3, B.フィールド4 ・・・   FROM テーブルB B WHERE ~ この場合、テーブルBにWHEREで指定した条件のレコードが存在しない場合はINSERTされなくなってしまいます。 存在しない場合は、該当のフィールドにはNULLをいれたいのですが、テーブルBからの結果が存在しない場合でも テーブルAにINSERTする方法はありますか?

  • SQLServer認証とWIndows認証

    お世話になります。 現在リモートのSQLServerにVB.NETのアプリからADO.NETで接続しようとしていますが、Windows認証の接続ができなく困っております。 sqlcmdコマンド使いSQLServer認証で確認すると以下の方法であっさりできました。 sqlcmd -S DBのホスト名 -U ユーザID -P パスワード -d DB名 しかし、Windows認証は「sqlcmd -S Bのホスト名 -E」を実行するとGuestユーザではログインできるのですが、他ユーザではログインできません。シクライアントPCとDBサーバ間の信頼関係ができていないのが原因のように思われますが、クライアント及びDBサーバのWindowsのログインユーザ名/パスワードは同じ、ワークグループも同じです。 また、SQLServerのManagement Studioを用いてユーザは作成してあります。 エラーは以下となります。 ----------------------------------------------------------- サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした) ----------------------------------------------------------- お手数お掛けしますが、宜しくお願いします。

  • VB2005からSQLServer2005への接続

    VB2005とSQLServer2005のどちらも製品版をインストールしました。 VB2005よりサーバエクスプローラから接続の追加により自分で作成したテーブルに接続を試みたところ、 以下のようなエラーが発生し接続できません。 (エラー内容)サーバーへの接続を確立しているときにエラーが発生しました。SQL Server2005に接続しているときにこのエラーが発生した場合は、SQL Serverの既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。(provider:共有メモリ プロバイダ,error:40-SQL Serverへの接続を開けませんでした) なにかSQLServer側の設定を変更しないと接続できないのでしょうか? どなたかアドバイスお願いします<(_ _)>

  • Accessへ日付をINSERT

    今Access2000のテーブルから文字として受け取ったデータを 同じくAccessの別テーブルの日付型にINSERTしようとしています。 ソフトはVC6.0を使用しています。 受け取るSELECTはうまくできています。 UCHAR sqlstr [ ] ="INSERT INTO テーブル名"           "(カラム1、カラム2、カラム3)"           "VALUES(?,?,?)"; INSERTはこのようにSQL文を用意しておいてSQLExecuteで SQL文を実行しようとしています。 この場合にカラム1が日付型だとしたら、 「?」のパラメータには文字として渡し、 SQL文のなかで "VALUES(to_date(?,'YYYYMMDD'),?,?)"; とすればうまくいくと思ったのですができません。 いろいろサイトを見るとAccessでは「’」ではなく「#」を使うと 書いてあったので to_date(?,#YYYYMMDD#) とやったのですがエラーになってしまいます。 ちなみにパラメータとして渡す文字列は「20020413」という 8桁の普通の文字です。 どなたか知っている方いませんでしょうか? 他に方法があればそれでも構いません。 どうか教えてください。m(__)m どうしても先へ進めません…。

  • DBへのinsert文作成方法

    VB2008Ex SQLServer2008Exを使用してます。 SQLClientで接続してますがVBから、あるテーブルのフィールド数・フィールド名・型・最大バイト数(文字数)を取得することは可能でしょうか? GetSchemaGetSchemaでフィールド名だけはは持ってこれそうなのですが・・・。 insertする時にフィールド数が多いのでSQL文がすごく長くなってしまいます。なので上記のバイト数が分かれば読み込んだテキストデータを ループで切り出しながら「,」や「''」を付加してSQL文が簡単に作れるかな?と思っています。 開発環境は上記の通りです。

  • SQL文がDouble型として認識される

    SQL文がDouble型として認識される 質問させて頂きます。 ユーザーのポイントを引き算し、SQLにアップデートするプログラムを組んでいます。 実行すると String "UPDATE 「テーブル名」 SET 「要素名(Integer)」 " から型 'Double' への変換は無効です。 というエラーが出るのですが、SQL文の部分を何故Doubleに変換するのでしょうか? デバッグにて変数を確認し、String等をいれてみても同じエラーが出る上 SQL文は他の部分で正常に動いているものをコピーしても同じエラーが出ます。 INSERT INTO テーブル名(要素) VALUES(xxx)"であれば 「String "INSERT INTO テーブル名(要素) VALUES」 " から型 'Double' への変換は無効です。」 となります。 SQL文の記述が間違っているとは思えず、VBの記述の問題としてここで質問させて頂きました。 コードは以下の通りで、環境はVB2010 + SQL Server2008です。 回答して頂くために不足している情報がありましたらすぐに追記致します。 至らない文章ではありますが、どうかよろしくお願い致します。 Dim point As Integer point = point(Integer型) - price(Integer型) Dim strSQL As String = "UPDATE 「テーブル名」 SET 「要素(Int型)」 = '" + point + "' WHERE UserID = '" + userid(String型) + "'" cn.ConnectionString = My.Settings.ServerURL Dim cmd4 As New SqlCommand(strSQL, cn) cn.Open() cmd4.ExecuteNonQuery() cn.Close()

  • VBでSQL文のUPDATE構文を使った時のエラーについて

    こんにちは。全くのVB初心者ですが回答、ご指摘のほうよろしければお願いします。 Microsoft Visual Studio 2005でデータベース管理のアプリケーションを制作しているんですが、エラーが出て困っています。 本フォームの各Textboxの編集した値を、 利用者カルテフォーム(別フォーム)のDataGridViewとデータベースに反映させるというプログラミングにしようとしています。 以下のコードでデバッグしようとしても「UPDATE ステートメントの構文エラーです。」というエラーメッセージが出てきて実行できない状態です。 VB中学校というサイトのデータベース講座を参考にしました。 ------------------------------------------------------------ Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:xxxx.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(利用者カルテDataGridView1.DataSource, DataTable) Dim Row As DataRow Dim Adapter As New OleDbDataAdapter(SQLCm) Row = Table.NewRow Row("No") = NotextBox.Text Row("名前") = 名前TextBox.Text Row("フリガナ") = フリガナTextBox.Text Table.Rows.Add(Row) Dim SQL As String = "" SQL = "UPDATE 患者データ SET " SQL &= " No = " & Row("No") & "', " SQL &= " 名前 = '" & Row("名前") & "', " SQL &= " フリガナ= " & Row("フリガナ") & "', " SQL &= " WHERE " SQL &= " No = " & NotextBox.Text SQLCm.CommandText = SQL Cn.Open() ※SQLCm.ExecuteNonQuery() Cn.Close() 利用者カルテ.Show() Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub ---------------------------------------------------------- 以上が実際にエラーがでる部分になります。 ※の部分で「UPDATE ステートメントの構文エラーです。」というエラーが指摘されています。 ちなみに他のフォームでINSERT文も使っているのですが、そちらは問題なく実行できる状態です。 初歩的な質問で申し訳ないですが、よければ回答のほうよろしくお願いします。

  • SQL Server 2008のsqlcmdコマンドでlocalhost以外で接続できない

    SQL Server2008のsqlcmdコマンドでデータベースに接続しようとするのですが、localhostアカウント以外接続ができません。 理由を教えてください。 【成功】 sqlcmd -S localhost -d tempdb -E -i create.sql 【失敗】 sqlcmd -S 1.1.1.1 -d tempdb -E -i create.sql 【エラー内容】 エラー: Microsoft SQL Server Native Client 10.0: 通信リンクが失敗しました。。 Sqlcmd: エラー: Microsoft SQL Server Native Client 10.0: SQL Server への接続の確立中に、ネットワーク関連のエラーまたはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできません。インスタンス名が正しいことと、SQL Server がリモート接続を許可するように構成されていることを確認してください。詳細については、SQL Server オンライン ブックを参照してください。。

このQ&Aのポイント
  • カートリッジ交換ができないトラブルを解決する方法をご紹介します。
  • お使いのブラザー製品でカートリッジ交換ができない問題に直面していませんか?解決方法をまとめました。
  • カートリッジ交換ができない場合の対処法をご紹介します。お困りの方は必見です。
回答を見る

専門家に質問してみよう