2013-05-13 81 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