0

私が得たもの:

db1 から db2 に情報 (行) を挿入するための 2 つの mdb データベースと 1 つのアプリケーション。

コードを実行しているとき、例外があります:

System resource exceeded.


コード:


接続文字列:

Dim db2Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db2.mdb;Persist Security Info=False;")

Dim db1Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\db1.mdb;Persist Security Info=False;")


情報をコピーするコード:

Dim DataAddapter As New OleDb.OleDbDataAdapter
Dim ds As New DataSet

'Open DB1 Connection:

db1Connection.open()

'Select All From M

DataAddapter.SelectCommand = New OleDb.OleDbCommand("SELECT * FROM M", db1Connection)
Dim cmd As OleDb.OleDbCommand = DataAddapter.SelectCommand
Dim Reader As OleDb.OleDbDataReader = cmd.ExecuteReader()

'Before Reading Results From DB1 Lets Open DB2Connection:
db2Connection.open()

'Start Reading Results in LOOP:
        Do Until Reader.Read() = False
            Dim F_Name As String = Reader("F_NAME")
            Dim L_Name As String = Reader("L_NAME")
            Dim CITY As String = Reader("NAME_CITY")
            F_Name = Replace(F_Name, "'", "")
            L_Name = Replace(L_Name, "'", "")

'Start Moving The Results To Db2(Insert):
'--------------------------------------


                Dim Exist As Integer = 0
                Dim c As New OleDb.OleDbCommand
                c.Connection = db2Connection
                c.CommandText = "SELECT COUNT(*) FROM `Names` WHERE `LastName`='" & L_Name & "' AND `FirstName`='" & F_Name & "' AND `City`='" & CITY & "'"
'----------------------------------------
'Exception Here!! :(
'This Line Checking If Already Exist
                Exist = CLng(c.ExecuteScalar())
'----------------------------------------

                If Exist = 0 Then
                    c.CommandText = "INSERT INTO `Names` (`LastName`,`FirstName`,`City`) VALUES ('" & L_Name & "','" & F_Name & "','" & CITY & "')"
                    c.ExecuteNonQuery()
                    'Note: After this line i'am getting the Exception there... (2 queries executed ExecuteScalar + ExecuteNonQuery) maybe i need to create connection for every query? :S

                End If
       Loop



別のこと:この構文でクエリをdb2に送信する必要があります(そうしないと機能しません):

INSERT INTO `Names` (`LastName`,`FirstName`,`City`) VALUES ('" & L_Name & "','" & F_Name & "','" & CITY & "')
i have to use the ->  `  <- to the name of the columns,
but when i'am sending a query to db1 without  ->  `  <-  it's working. :S and i dont know what is the difference between db1 to db2 but its very strange maybe my problem is there...


良い答えは良い例と良い説明です:).(c#またはvb.net)

4

1 に答える 1

0

あなたはSQLインジェクションの準備ができています...それについて読んで、少なくともSQLコマンドをPARAMETERIZEし、埋め込まれた値で実行する文字列ステートメントを作成しないでください。db2 がパラメーターをどのように処理するかは特にわかりません...「?」を使用する人もいます。プレースホルダーとして、SQL-Server は「@」を使用し、Advantage Database は「:」を使用します..どちらの場合も、その原則は次のとおりです.

c.CommandText = "select blah from `names` where LastName = ? and FirstName = ? and City = ?"

c.CommandText = "select blah from `names` where LastName = @parmLastName and FirstName = @parmFirstName and City = @parmCity"

上記の名前付きパラメーター (@parmLastName など) については、値と実際の COLUMN 名を区別するためだけに「parm」というプレフィックスを付けています。

次に、パラメータは次のようになります

c.Parameters.Add( "@parmLastName", yourLastNameVariable )
c.Parameters.Add( "@parmFirstName", yourFirstNameVariable)
c.Parameters.Add( "@parmCity", yourCityVariable)

「?」を使用する場合 明示的に名前が付けられていないパラメーターのバージョンでは、パラメーター コンテキストが "?" と同じ順序であることを確認する必要があります。プレースホルダー。

次に、呼び出しを実行します...すべてのクエリに同じ原則が適用されます(選択、挿入、更新、削除)


システム リソースについては、何件のレコードを取得していますか。データベース テーブル全体をプルダウンしようとして、システム メモリ リソースを圧迫している可能性があります。一度に 1 つのアルファベット文字に基づいて分類したい場合があります...

また、システム リソースとパッチによるアクセスに関する MS からのリンク。

于 2013-10-30T16:45:23.400 に答える