1

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

我习惯于在 MSSQL 中使用@somethingandcmd.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

再次感谢!

4

2 回答 2

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
于 2013-07-11T03:00:24.027 回答
0

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

  • 引用的大小写问题。如果您的列被定义为"Name"您需要在"Name"任何地方引用它,而不是Nameor name。参见词法结构

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

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

你确定你显示的代码是你得到错误的原因吗?您在文本中谈论@parameter等,但代码中没有类似的东西......

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

于 2013-07-11T01:51:22.227 回答