我正在向DataTable添加一个对象,它是DataSet的Tables集合的一部分。 然后,我在与前面提到的数据表关联的数据适配器上调用更新。 但是,当我调用 Update 时,它会抛出一个异常,指出"NOT NULL 约束失败:代理.port"。 我将分享我用来创建数据库的代码,加载它的数据,甚至是我正在使用的 Proxy 对象的构造函数。 第一个回答正确的人得到复选标记:)
谢谢!
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
代理对象构造函数
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
回答了我自己的问题。
通过创建 DataRow 对象并返回 dbDataSet.Tables("代理"(。NewRow((,然后设置每列值,如下所示:行。Item("ip"( = 值,最后将此行添加到我的数据集中的数据表中,在数据适配器上调用更新时满足 NOT NULL 约束。 问题仍然存在,为什么代理对象的 ItemArray 无法正确转换,列名与代理对象公共属性名称匹配。 哦,好吧,我不想考虑它,我的解决方法可以,因为它解决了我的头痛,比我希望的多了几行代码......