在VB.NET中指定psqlODBC参数

时间:2013-07-10 23:38:50

标签: vb.net postgresql odbc sql-insert

刚开始将PostgresQL用于vb应用程序(使用visual studio 2005 pro)并通过ODBC连接(这是使用ODBC连接而不是本机PostgresQL连接器的原因)。

我习惯在MSSQL中使用@somethingcmd.Parameters.Add("@something", data)格式。我有9个值,我想从一个表单中获取并在insert语句中使用它们,但似乎无法确定PostgresQL的语法。

想法?我搜索了两天试图找到这个btw的答案。

编辑:对不起,我已经删除了我正在尝试的代码,但是我的第一个参数名称“name”列上的“该列不存在”错误仍然存​​在。

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

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

上发生错误

再次感谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

  • 引用的资本化问题。如果您的列定义为"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执行操作,如果遇到问题,请跟进包含确切代码和错误的新问题。