为什么返回的OleDbConnection.GetSchema(“Columns”)没有行,而相同的代码适用于OracleConnection?
我已经创建了一个实用方法来从db表中获取模式。在本例中,oracle11db为什么返回的OleDbConnection.GetSchema(“Columns”)没有行,而相同的代码适用于OracleConnection?,oracle,ado.net,oledb,Oracle,Ado.net,Oledb,我已经创建了一个实用方法来从db表中获取模式。在本例中,oracle11db public static DataTable GetColumnsSchemaTable(DbConnection cnctn, string tableName) { DataTable schemaTable; string[] restrictions = new string[3] { null, tableName, null }; sche
public static DataTable GetColumnsSchemaTable(DbConnection cnctn, string tableName)
{
DataTable schemaTable;
string[] restrictions = new string[3] { null, tableName, null };
schemaTable = cnctn.GetSchema("Columns", restrictions);
/* table name is case sensitive and in XXXX db table names are UPPER */
if (schemaTable.Rows.Count == 0)
{
restrictions = new string[3] { null, tableName.ToUpper(), null };
schemaTable = cnctn.GetSchema("Columns", restrictions);
}
return schemaTable;
}
当使用System.Data.OracleClient提供程序工厂创建cnctn时,这可以正常工作。使用System.Data.OleDb provider factory创建该表时,该表没有行。我还有一个获取连接字符串的实用方法:
public static string GetDbConnectionString(DbConnection cnnctn, string provider, string server, string dbName, string user, string pwd)
{
if (cnnctn is OleDbConnection)
{
string usedProvider;
if (provider == null)
usedProvider = "msdaora";
else
usedProvider = provider;
return string.Format("Provider={0};Data Source={1};User Id={2};Password={3};",
usedProvider, dbName, user, pwd);
}
else if (cnnctn is System.Data.OracleClient.OracleConnection)
{
return string.Format("Data Source={0};User Id={1};Password={2};",
dbName, user, pwd);
}
else if (cnnctn is Oracle.DataAccess.Client.OracleConnection)
{
return string.Format("Data Source={0};User Id={1};Password={2};",
dbName, user, pwd);
}
else if (cnnctn is SqlConnection)
{
return string.Format("Data Source={0}; Initial Catalog={1}; User Id={2}; Password={3};",
server, dbName, user, pwd);
}
return string.Empty;
}
db连接也可以工作(我在尝试获取模式之前删除行)。一切帮助都将不胜感激
谢谢并致以最良好的问候-马蒂好的。我把它整理好了。我很久以前就编写了这段代码,只是为了现在不推荐使用的OracleClient,并留下了使用其他连接/提供程序工厂的可能性。我再也不记得了,每个连接的限制是不同的。因此正确的用法是:
string[] restrictions = new string[4] { null, null, tableName, null };
对于OLEDB连接。似乎我必须以某种方式给出一个模式。顺便说一下,我得到了一个与其他一些表模式同名的表。我不想在代码中也给所有表一个模式名。OracleClient只喜欢表名。有什么办法吗?也许我还需要利用其他模式集合来获取模式,但是我必须知道表名的语法。正在尝试schema.table。