[英]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.