来自ADO.NET的Pervasive SQL System存储过程错误

时间:2013-08-09 19:52:01

标签: c# ado.net pervasive pervasive-sql

我只是想通过系统存储过程返回列及其属性列表。我有什么文档似乎说下面的代码应该工作,但我得到“Pervasive.Data.SqlClient.Lna.k:[LNA] [Pervasive] [ODBC引擎接口]参数无效或缺失。”在执行。这是PSQL v11,.NET 4.5。

using (PsqlConnection conn = new PsqlConnection(cs))
    {
        PsqlCommand locationCmd = new PsqlCommand();
        PsqlParameter tableParam = new PsqlParameter();
        PsqlParameter returnParam = new PsqlParameter();
        returnParam.Direction = ParameterDirection.ReturnValue;
        locationCmd.CommandText = "psp_columns";
        locationCmd.Connection = conn;
        locationCmd.CommandType = CommandType.StoredProcedure;
        locationCmd.Parameters.Add(tableParam).Value = table;
        locationCmd.Parameters.Add(returnParam);
        conn.Open();
        locationCmd.ExecuteNonQuery();

    }

4 个答案:

答案 0 :(得分:0)

我认为问题就在这一行:

  locationCmd.Parameters.Add(tableParam).Value = table;

您应该在添加参数之前设置值,而不是之后。

  tableParam.Value = table;
  locationCmd.Parameters.Add(tableParam);

我不了解Psql但是对于MSSQL,通常你还需要将参数名称定义为存储过程中的参数名称,或者至少是我所做的。

  SqlParameter param = new SqlParameter("@tableParam", value);

答案 1 :(得分:0)

您应该尝试使用Psqlconnection中提供的GetSchema方法获取表SCHEMA的信息。我在他们的支持网站上搜索了一下,虽然我没有找到使用Tables集合的直接示例,但似乎支持此方法。

这只是一个改编自我在SqlServer上的测试的例子,我没有Pervasive安装,但你可以试试结果是否相同

using(PsqlConnection cn = new PsqlConnection("your connection string here"))
{
     cn.Open(); 
     string[] selection = new string[] { null, null, table }; 
     DataTable tbl = cn.GetSchema("Columns", selection); 
     foreach (DataRow row in tbl.Rows)
     { 
         Console.WriteLine(row["COLUMN_NAME"].ToString() + " " + 
                           row["IS_NULLABLE"].ToString() + " " +
                           row["DATA_TYPE"].ToString() 
         );
     } 
}

答案 2 :(得分:0)

psp_Columns系统存储过程定义为call psp_columns(['database_qualifier'],'table_name', ['column_name'])。我知道它说数据库限定符是可选的,但我认为这是必需的。您可以尝试为限定符传递空字符串。类似的东西:

using (PsqlConnection conn = new PsqlConnection(cs))
    {
        PsqlCommand locationCmd = new PsqlCommand();
        PsqlParameter dbParam = new PsqlParameter();
        PsqlParameter tableParam = new PsqlParameter();
        PsqlParameter returnParam = new PsqlParameter();
        returnParam.Direction = ParameterDirection.ReturnValue;
        locationCmd.CommandText = "psp_columns";
        locationCmd.Connection = conn;
        locationCmd.CommandType = CommandType.StoredProcedure;

        locationCmd.Parameters.Add(dbParam).Value = ""; //might need two single quotes ('')
        locationCmd.Parameters.Add(tableParam).Value = table;
        locationCmd.Parameters.Add(returnParam);
        conn.Open();
        locationCmd.ExecuteNonQuery();

    }

答案 3 :(得分:0)

我试图解决这个问题,但是使用了表格程序。即使数据库和表名是可选的,您仍然必须提供值。对于可选参数,传入DBNull.Value

这对我有用:

PsqlCommand cm = new PsqlCommand();
cm.CommandText = "psp_tables";
cm.CommandType = CommandType.StoredProcedure;
cm.Connection = new PsqlConnection();
cm.Connection.ConnectionString = <your connection string>;
cm.Parameters.Add(":database_qualifier", DBNull.Value);
cm.Parameters.Add(":table_name", DBNull.Value);
cm.Parameters.Add(":table_type", "User table");