我只是想通过系统存储过程返回列及其属性列表。我有什么文档似乎说下面的代码应该工作,但我得到“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();
}
答案 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");