2013-05-13 80 views
0

我想按照這個答案在SQLite數據庫一次插入多行:錯誤id_column

Is it possible to insert multiple rows at a time in an SQLite database?

這似乎很好地工作,以找出如何在sqlite3的數據庫做多個插入,但我有一個問題:我的表有9列+通常的ID是「主鍵自動增量非空」...總共10列。

如果我使用上述主題中指出的語句,它只有在指定ID時才起作用。

如果我省略語句中的ID,它給我的錯誤「的SQLite錯誤表重量有10列,但9個值提供」

如果我做一個單一的插入和我省略,當然它給人的ID下一個默認值自動。

如何忽略此多重插入的ID?

我不知道這是否是相關的,但我在Windows CE上緊湊框架3.5編程6.

謝謝

'DATABASE WEIGHT COLUMNS NAME 
Private Const DBWGTIdLotto = "IDLotto" 
Private Const DBWGTProgressive = "ProgressiveNum" 
Private Const DBWGTWeight = "Weight" 
Private Const DBWGTTime = "theTime" 
Private Const DBWGTStatusFlag = "StatusFlag" 
Private Const DBWGTTot1 = "Tot1" 
Private Const DBWGTTot2 = "Tot2" 
Private Const DBWGTTot3 = "Tot3" 
Private Const DBWGTPrice = "Price" 

'CREATE THE DATABASE 
Public Sub CreateDatabaseWeights() 
    Try 
     If Not File.Exists(Me.DatabasePesatePath) Then 
      'Crea la tabella 
      Dim sqlString As String = "CREATE TABLE " + DatabasePesateTableName + "(" _ 
            + "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " _ 
            + DBWGTIdLotto + " INTEGER NOT NULL, " _ 
            + DBWGTProgressive + " INTEGER NOT NULL, " _ 
            + DBWGTWeight + " INTEGER, " _ 
            + DBWGTTime + " TIMESTAMP, " _ 
            + DBWGTStatusFlag + " INTEGER, " _ 
            + DBWGTTot1 + " BOOLEAN, " _ 
            + DBWGTTot2 + " BOOLEAN, " _ 
            + DBWGTTot3 + " BOOLEAN, " _ 
            + DBWGTPrice + " REAL" _ 
            + ");" 
      Dim db As New SQLiteDatabase(Me.DatabasePesatePath) 
      db.ExecuteNonQuery(sqlString) 
     End If 
    Catch ex As Exception 
     AggiungiErrore("CLASS: RecordPeso => CreateDatabaseWeights: " + ex.Message) 
    End Try 
End Sub 

'SUB TO INSERT MULTIPLE RECORDS 
Public Sub AggiungiPeso(ByVal lotto As Integer, ByVal progressive As Integer, ByVal weight As Integer, ByVal flag As Byte, ByVal tot1 As Boolean, ByVal tot2 As Boolean, ByVal tot3 As Boolean, ByVal price As Single) 
    Try 


     Dim test(100) As Dictionary(Of String, String) 
     For i As Integer = test.GetLowerBound(0) To test.GetUpperBound(0) 
      'Crea il dizionario con i valori 
      Dim data As New Dictionary(Of String, String) 
      data.Add("id", i.ToString) 'IF I REMOVE THIS, IT GIVES ERROR !!!!!!!!!!!!!! 
      data.Add(DBWGTIdLotto, lotto.ToString) 
      data.Add(DBWGTProgressive, progressive.ToString) 
      data.Add(DBWGTWeight, weight.ToString) 
      data.Add(DBWGTTime, Now.ToString) 
      data.Add(DBWGTStatusFlag, flag.ToString) 
      data.Add(DBWGTTot1, IIf(tot1, "1", "0")) 
      data.Add(DBWGTTot2, IIf(tot2, "1", "0")) 
      data.Add(DBWGTTot3, IIf(tot3, "1", "0")) 
      data.Add(DBWGTPrice, price.ToString) 
      test(i) = Data 
     Next 

     'Salva il nuovo peso 
     Dim db As New SQLiteDatabase(Me.DatabasePesatePath) 
     db.MultipleInsert(DatabasePesateTableName, test) 
    Catch ex As Exception 
     AggiungiErrore("CLASS: RecordPeso => AggiungiPeso: " + ex.Message) 
    End Try 
End Sub 

--------------- DATABASE CLASS -------------------- 

'Insert a row in the database 
'<tableName> Nome della tabella 
'<data()>  Array di Dizionari con coppie di colonne/valori 
'<return>  Boolean per successo o fallimento 
Public Function MultipleInsert(ByVal tableName As String, ByVal data() As Dictionary(Of String, String)) As Boolean 
    Dim vals As String = "" 
    Dim columns As String = "" 
    Dim returnCode As Boolean = True 
    Try 
     'Se abbiamo elementi 
     If data.Count >= 1 And data(0).Count >= 1 Then 
      Dim tmpQuery As String = String.Format("INSERT INTO {0} SELECT ", tableName) 
      'Creo la query per l'aggiornamento 
      For Each val As KeyValuePair(Of String, String) In data(0) 
       tmpQuery += String.Format("'{0}' AS '{1}', ", val.Value.ToString, val.Key.ToString) 
      Next 
      'Remove last useless comma 
      tmpQuery = tmpQuery.Substring(0, tmpQuery.Length - 2) 
      'Aggiorno tutti i valori degli altri dizionari 
      For i As Integer = data.GetLowerBound(0) + 1 To data.GetUpperBound(0) 
       'Contatore inizio riga 
       Dim j As Integer = 0 
       'Add value of other dictionaries 
       For Each Val As KeyValuePair(Of String, String) In data(i) 
        If j = 0 Then tmpQuery += " UNION SELECT" 
        tmpQuery += String.Format(" '{0}',", Val.Value.ToString) 
        j += 1 
       Next 
       tmpQuery = tmpQuery.Substring(0, tmpQuery.Length - 1) 
       j = 0 
      Next 
      'Aggiorna il DB 
      Me.ExecuteNonQuery(tmpQuery) 
     End If 
    Catch ex As Exception 
     AggiungiRigaSuFile(ErroriPath, "CLASS: SQLiteDatabase => MultipleInsert: " + ex.Message, True, True) 
     returnCode = False 
    End Try 
    Return returnCode 
End Function 

'Interact with database for purpose different from query 
'<sqlString> SQL string for interacting in DB 
'<return>  Number of columns updated 
Public Function ExecuteNonQuery(ByVal sqlString As String) As Integer 
    Dim rowsUpdated As Integer = 0 
    Try 
     'Definisco la connessione al database 
     Using cnn As New SQLiteConnection(dbConnection) 
      cnn.Open() 
      Dim cmd As New SQLiteCommand(cnn) 
      cmd.CommandText = sqlString 
      'Aggiorno i dati 
      rowsUpdated = cmd.ExecuteNonQuery 
     End Using 
    Catch ex As Exception 
     AggiungiRigaSuFile(ErroriPath, "CLASS: SQLiteDatabase => ExecuteNonQuery: " + ex.Message, True, True) 
    End Try 
    'Ritorna le righe elaborate 
    Return rowsUpdated 
End Function 
+1

發佈您的代碼。 – dugas 2013-05-13 14:30:31

+0

聽起來很像你實際上沒有在PK領域設置AUTOINCREMENT。 – ctacke 2013-05-13 15:24:46

+0

在這裏你是代碼,我粘貼相關的子...希望在這個過程中沒有犯過錯誤。 @ctacke:如果我沒有自動增量...我怎麼能做一個插入沒有指定ID? – 2013-05-13 15:38:35

回答

0

不包括在ID列名第一套括號。 然後在值部分中也不包含任何值。

+0

如果我不包含ID,它會給我錯誤「SQLite錯誤表權重有10列但提供了9個值」 – 2013-05-13 14:54:58

+0

然後您在第一個列表中確定了10列......您不應該這樣做。 – Randy 2013-05-13 19:54:05

+0

爲什麼我應該只聲明9?我想要通常的ID,如果我忽略它,我不會在表中找到。 – 2013-05-14 07:14:26