0

我只是想通过系统存储过程返回列列表及其属性。我所拥有的文档似乎说下面的代码应该可以工作,但我得到“Pervasive.Data.SqlClient.Lna.k: [LNA][Pervasive][ODBC Engine Interface]Invalid or missing argument”。在执行。这是 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

4 回答 4

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() 
         );
     } 
}
于 2013-08-09T20:43:13.637 回答
0

我认为问题出在这一行:

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

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

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

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

  SqlParameter param = new SqlParameter("@tableParam", value);
于 2013-08-09T20:30:42.367 回答
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");
于 2013-08-29T14:16:08.820 回答
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();

    }
于 2013-08-09T20:49:05.133 回答