繁体   English   中英

来自ADO.NET的普遍SQL系统存储过程错误

[英]Pervasive SQL System Stored Procedure from ADO.NET error

我只是想通过系统存储过程返回列及其属性的列表。 我似乎在说什么文档,下面的代码应该起作用,但是我得到“ Pervasive.Data.SqlClient.Lna.k:[LNA] [Pervasive] [ODBC Engine Interface]无效或缺少参数。” 在执行。 这是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();

    }

我认为问题在于此行:

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

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

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

我不了解Psql,但是对于MSSQL,通常您还需要将参数名称定义为在存储过程中找到的名称,至少这是我要做的。

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

您应该尝试使用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() 
         );
     } 
}

psp_Columns系统存储过程定义为调用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();

    }

我也试图解决这个问题,但是使用了表格程序。 即使数据库和表名是可选的,您仍然必须提供值。 对于可选参数,传入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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM