在 DataAdapter 上调用 Update 时 VB.NET SQLite "constraint failed"?



我正在向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 无法正确转换,列名与代理对象公共属性名称匹配。 哦,好吧,我不想考虑它,我的解决方法可以,因为它解决了我的头痛,比我希望的多了几行代码......

相关内容

最新更新