2017-02-04 2 views
1

Я добавляю объект к DataTable, который является частью коллекции Tables DataSet. Затем я вызываю Update на DataAdapter, связанном с вышеупомянутым DataTable. Однако, когда я вызываю Update, он выдает исключение, говорящее, что «NOT NULL constraint failed failed: proxies.port». Я поделюсь используемым мной кодом для создания базы данных, загрузки ее данных и даже конструктора объекта Proxy, который я использую. Сначала правильно ответить получает галочку :)Устранение ограничений SQLite SQLite при вызове Update on DataAdapter?

Спасибо!

Public Sub CreateDB() 
    Dim dbLocation As String = My.Application.Info.DirectoryPath & "\data.s3db" 
    SQLiteConnection.CreateFile(dbLocation) 
    Using conn As New SQLiteConnection("DataSource=" & dbLocation & ";Version=3;") 
     Using cmd As New SQLiteCommand(conn) 
      conn.Open() 
      cmd.CommandText = "CREATE TABLE proxies (
           ip Text Not NULL, 
           port Integer Not NULL, 
           countryName Text Not NULL, 
           pingTime Integer Not NULL, 
           status Text Not NULL, 
           PRIMARY KEY (ip, port), 
           unique(ip, port) 
          ); 
          CREATE TABLE [judges] (
           [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
           [url] TEXT UNIQUE NOT NULL, 
           [pingTime] INTEGER NOT NULL, 
           [status] TEXT NOT NULL 
          ); 
          CREATE TABLE [tests] (
           [id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
           [url] TEXT NULL, 
           [validationText] TEXT NOT NULL, 
           [invalidationText] TEXT NOT NULL, 
           [status] TEXT NOT NULL 
          )" 
      cmd.ExecuteNonQuery() 
      conn.Close() 
     End Using 
    End Using 
End Sub 

И я загрузке данных в суб следующим образом:

Public Sub LoadDataFromDB() 
    Using connection As New SQLiteConnection(dbConnectionString) 
     dbDataSet.Tables.Add("proxies") 
     dbProxyAdapter.Fill(dbDataSet.Tables("proxies")) 
     Dim cmdBuilder As New SQLiteCommandBuilder(dbProxyAdapter) 
     dbProxyAdapter.InsertCommand = cmdBuilder.GetInsertCommand 
     Dim proxy As New Proxy("1.1.1.1:12345") 
     dbDataSet.Tables("proxies").Rows.Add(proxy) 
     dbProxyAdapter.Update(dbDataSet.Tables("proxies")) 
    End Using 
End Sub 

Proxy Объект Конструктор

Public Sub New(proxy As String) 
    If System.Text.RegularExpressions.Regex.IsMatch(proxy, "(\d{1,3}\.){3}\d{1,3}:\d{2,5}") Then 
     Me.IP = proxy.Split(":")(0) 
     Me.Port = proxy.Split(":")(1) 
     Me.PingTime = 0 
     Me.Status = ProxyStatus.Unknown 
     Me.CountryName = "Unknown" 
    Else 
     Throw New Exception("Invalid proxy string '" & proxy & "'") 
    End If 
End Sub 
+0

Вы должны показать свою команду обновления, чтобы решить проблему –

ответ

0

ответил на мой собственный вопрос.

Создание объекта DataRow и возврат dbDataSet.Tables ("proxies"). NewRow(), а затем установка каждого значения столбцов liko: row.Item ("ip") = значение и, наконец, добавление этой строки в DataTable в моем DataSet ограничение NOT NULL выполняется при вызове Update в DataAdapter. Вопрос все еще остается, почему ItemArray объекта Proxy не переводится правильно, имена столбцов соответствуют именам общедоступных объектов прокси-объектов. Ну, я не думаю, что созерцаю это, мой способ обхода, потому что он решает мою головную боль, с несколькими дополнительными строками кода, чем я надеялся ....