【问题标题】:Specifying psqlODBC parameters in VB.NET在 VB.NET 中指定 psqlODBC 参数
【发布时间】:2013-07-10 23:38:50
【问题描述】:

刚开始将 PostgresQL 用于 vb 应用程序(使用 Visual Studio 2005 Pro)并通过 ODBC 连接(使用 ODBC 连接而不是本机 PostgresQL 连接器是有原因的)。

我习惯于在 MSSQL 中使用 @somethingcmd.Parameters.Add("@something", data) 格式。我想从表单中获取 9 个值并在插入语句中使用它们,但似乎无法弄清楚 PostgresQL 的语法。

想法?我已经搜索了两天试图找到这个顺便说一句的答案。

编辑:抱歉,我已经删除了我正在尝试的代码,但是我在列“名称”上不断收到“列不存在”错误,这是我的第一个参数。

我知道这不是连接错误或命名约定问题或类似问题,因为以下代码确实有效。下面是我现在做的测试:

strSQL = "INSERT INTO tableb (name, extension, length,creationtime,lastaccesstime,lastwritetime,directoryname) VALUES ('Name','Extension','Length','CreationTime','LastAccessTime','LastWriteTime','DirectoryName')"

objConn.ConnectionString = strConnString
        objConn.Open()
        With objCmd

            .Connection = objConn
            .CommandText = strSQL
            .CommandType = CommandType.Text
            .ExecuteNonQuery()
        End With

哦,我使用的 ODBC 版本是 8.03.02.00

更多信息: 导致错误的代码:

strSQL = "INSERT INTO TABLEB (name) VALUES (@name)"

    objConn.ConnectionString = strConnString
    objConn.Open()
    'Try
    With objCmd
        .Parameters.Add("@name", SqlDbType.Int)
        .Parameters("@name").Value = "SomeText"

        .Connection = objConn
        .CommandText = strSQL
        .CommandType = CommandType.Text
        .ExecuteNonQuery()
    End With

带参数的代码:

确切的错误:ODBC 异常:

"ERROR [42703] ERROR: column "name" does not exist;
Error while executing the query"

错误发生在 .ExecuteNonQuery

再次感谢!

【问题讨论】:

  • 显示您的代码您遇到的任何错误的确切文本,以及您的 PostgreSQL 版本(“select version()”)和 psqlODBC 版本。通过编辑您的问题然后在完成后在此处添加评论来做到这一点。

标签: vb.net postgresql odbc sql-insert


【解决方案1】:

问题在于下面的代码

.Parameters.Add("@name", SqlDbType.Int)
.Parameters("@name").Value = "SomeText"

您将名称设置为SqlDbType.Int,但您为其设置了文本值

在声明参数时给出正确的列类型并分配与给定数据类型匹配的正确值。

并且同样在sql语句中给出参数?,然后按照sql给出的相同顺序添加命令参数。 ODBC 不支持命名参数。

示例代码:

strSQL = "INSERT INTO TABLEB (name) VALUES (?)"
objConn.ConnectionString = strConnString
objConn.Open()
With objCmd
    .Parameters.AddWithValue("name", "SomeText")
    .Connection = objConn
    .CommandText = strSQL
    .CommandType = CommandType.Text
    .ExecuteNonQuery()
End With

【讨论】:

  • 完美!,我知道我错过了一些有 ?或者其他的东西!所以,既然它是有序的,要添加额外的参数,我只需要使用像 strSQL = "INSERT INTO tableb (name, extension) VALUES (?, ?)" 这样的 sql 语句并将我的下一个参数放在第一个下面的行中。
【解决方案2】:

正如所写的那样,查询很好。鉴于所述错误,可能的问题是:

  • 引用的大写问题。如果您的列定义为"Name",则需要在任何地方将其称为"Name",而不是Namename。见lexical structure

  • 访问错误的数据库或您设置并忘记的同一数据库的旧版本,其中包含 tableb 而没有 name

  • 在“匿名化”查询时,您隐藏了真正的问题,或者您引用的错误与您正在运行的代码不匹配。例如,引用问题。

您确定您显示的代码就是您收到错误的原因吗?你在文中讲@parameter之类的东西,但是代码里没有这样的……

您当然应该使用 参数化查询 而不是这种方法来防止 SQL injection 攻击,因为我确信您的 真实 代码不会对值进行硬编码. psqlODBC 和 MS SQL Server 的 ODBC 驱动程序的参数使用应该没有什么不同,这是查询参数的一半。我不会说 Visual Basic(或者 ODBC,如果我可以避免的话),the SQL injection rosetta stone 没有 VB.NET 的详细信息。尝试使用 MS SQL Server 进行操作,如果遇到问题,请跟进包含确切代码和错误的新问题。

【讨论】:

  • 感谢您的意见。 db 中的列名都是小写的。 PostgresQL 中只设置了一个数据库。我现在使用的查询工作正常,并且数据被正确添加到表中,这是当我尝试使用 @something 和 cmd.Parameters.Add("@something", data) 方法使用参数时(如所述这里:msdn.microsoft.com/en-us/library/…) 我遇到了错误。因此,对于 PostgresQL 或其他东西,参数占位符必须不同......
  • @JimB 好的,所以您显示的代码 匹配错误。请编辑问题,以便显示您从中得到错误的确切代码以及错误的完整、准确的文本。表定义(如psql 中的\d tablename)也不会受到伤害。记得在编辑后发表评论,否则不会发送通知。
  • 好的,有时间以缩写形式重写代码,但仍然得到相同的错误。在我的问题中添加了代码和错误。谢谢!
  • 您说“psqlODBC 和 MS SQL Server 的 ODBC 驱动程序之间的参数使用应该没有区别”。但是,我同时使用了 MySQL 和 MSSQL,它们的参数占位符不同,mysql 使用 ?或 $(不记得是哪个)mssql 在哪里使用@。所以,我认为 PostgresQL 是一样的……不过我可能是错的……
  • @JimB 好的,这与 JDBC 和我使用的大多数其他工具不同,它们倾向于保持参数语法统一。如果 ODBC 也不使用一致的放置语法,那就太令人震惊了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2016-04-05
  • 2011-04-20
相关资源
最近更新 更多