使用 Npgsql 和 VB.net 将数据插入 Postgresql 时出现问题
Having an issue inserting data into Postgresql using Npgsql and VB.net
有人可以看看我的代码并指出为什么它不允许我将数据插入我的 Postgres 数据库吗?我正在为我的 collection.
创建一个漫画书数据库
每次我点击提交按钮提交输入的数据时,调试器都会抛出异常:
''Npgsql.PostgresException' 类型的未处理异常发生在 Npgsql.dll'
在执行 myCommand.ExecuteNonQuery() 函数时发生。
我花了一整天时间想弄明白这个问题,我完全是个菜鸟。任何指导都会很棒!
Dim myConnection As NpgsqlConnection = New NpgsqlConnection()
Dim myCommand As NpgsqlCommand
Dim mySQLString As String
myConnection.ConnectionString = "Server=localhost;Port=5432;Database=ComicsDatabase;User Id=postgres;Password=xxxxxxxx;"
mySQLString = "INSERT INTO Comics (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) VALUES (" & comicName & "," & issueNumber & "," & publicationDate & "," & publisher & "," & isVariant & ");"
myCommand = New NpgsqlCommand(mySQLString, myConnection)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
当您按上述方式连接字符串以形成 sql 命令时,很容易陷入常见错误。例如,在您的代码中,字符串值应该用单引号括起来。
所以,假设IssueName是一个字符串类型的字段,你应该这样表达这个值
.... VALUES ('" & comicName & "'," & ....
但这是比疾病还糟糕的治疗方法。首先,如果您的 comicName 变量包含单引号,您将遇到另一个问题,其次,字符串的连接是导致 Sql 注入(一个非常危险的代码漏洞)的主要方式
将值传递给数据库引擎(...这个世界上的任何数据库引擎)的唯一正确方法是通过参数化查询
您编写的查询使用参数占位符而不是直接使用值
(没有字符串连接,没有奇怪的 & 和单引号....)
mySQLString = "INSERT INTO Comics
(IssueName,IssueNumber,PublicationDate,Publisher,IsVariant)
VALUES (:comicName,:issueNumber,:publicationDate,:publisher,:isVariant);"
然后使用添加到命令参数集合的参数传递值
myCommand = New NpgsqlCommand(mySQLString, myConnection)
myCommand.Parameters.Add(":comicName", NpgsqlDbType.Varchar).Value = comicName
当然,您需要添加占位符所需的所有其他参数,重要的是要记住为您尝试更新的特定列使用正确的 NpgsqlDbType。
有人可以看看我的代码并指出为什么它不允许我将数据插入我的 Postgres 数据库吗?我正在为我的 collection.
创建一个漫画书数据库每次我点击提交按钮提交输入的数据时,调试器都会抛出异常:
''Npgsql.PostgresException' 类型的未处理异常发生在 Npgsql.dll'
在执行 myCommand.ExecuteNonQuery() 函数时发生。
我花了一整天时间想弄明白这个问题,我完全是个菜鸟。任何指导都会很棒!
Dim myConnection As NpgsqlConnection = New NpgsqlConnection()
Dim myCommand As NpgsqlCommand
Dim mySQLString As String
myConnection.ConnectionString = "Server=localhost;Port=5432;Database=ComicsDatabase;User Id=postgres;Password=xxxxxxxx;"
mySQLString = "INSERT INTO Comics (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) VALUES (" & comicName & "," & issueNumber & "," & publicationDate & "," & publisher & "," & isVariant & ");"
myCommand = New NpgsqlCommand(mySQLString, myConnection)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
当您按上述方式连接字符串以形成 sql 命令时,很容易陷入常见错误。例如,在您的代码中,字符串值应该用单引号括起来。
所以,假设IssueName是一个字符串类型的字段,你应该这样表达这个值
.... VALUES ('" & comicName & "'," & ....
但这是比疾病还糟糕的治疗方法。首先,如果您的 comicName 变量包含单引号,您将遇到另一个问题,其次,字符串的连接是导致 Sql 注入(一个非常危险的代码漏洞)的主要方式
将值传递给数据库引擎(...这个世界上的任何数据库引擎)的唯一正确方法是通过参数化查询
您编写的查询使用参数占位符而不是直接使用值 (没有字符串连接,没有奇怪的 & 和单引号....)
mySQLString = "INSERT INTO Comics
(IssueName,IssueNumber,PublicationDate,Publisher,IsVariant)
VALUES (:comicName,:issueNumber,:publicationDate,:publisher,:isVariant);"
然后使用添加到命令参数集合的参数传递值
myCommand = New NpgsqlCommand(mySQLString, myConnection)
myCommand.Parameters.Add(":comicName", NpgsqlDbType.Varchar).Value = comicName
当然,您需要添加占位符所需的所有其他参数,重要的是要记住为您尝试更新的特定列使用正确的 NpgsqlDbType。