使用Npgsql和VB.net将数据插入Postgresql时出现问题

时间:2016-12-10 23:12:40

标签: vb.net postgresql npgsql

有人可以查看我的代码,并可能指出为什么它不允许我将数据插入我的Postgres数据库?我正在为我的收藏创​​建一个漫画书数据库。

每次单击提交按钮提交输入的数据时,调试器都会抛出异常:

'Npgsql.dll'中发生了'Npgsql.PostgresException'类型的未处理异常

执行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()

1 个答案:

答案 0 :(得分:0)

如上所述连接字符串以形成sql命令时,很容易陷入常见错误。例如,在代码中,字符串值应该用单引号括起来。

因此,假设IssueName是字符串类型字段,您应该以这种方式表示值

.... VALUES ('" & comicName & "'," & ....

但这是一种比疾病更糟的补救措施。首先,如果您的comicName变量包含单引号,则会出现另一个问题,其次,字符串的串联是导致Sql Injection的主要方式(一个非常危险的代码漏洞)

将值传递给数据库引擎(...这个世界的任何数据库引擎)的唯一正确方法是通过参数化查询

您编写查询放置参数占位符而不是直接写入值 (没有字符串连接,没有奇怪的&和单引号....)

  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。