我猜不是所有的SQL都是平等创建的。我将深入研究c#中的DSN和ODBC驱动程序,并进行一些尝试。我试图获取由我所知的DSN使用Transoft ODBC驱动程序定义的数据库中的所有表。我可以连接到它并使用代码获取表:
public void ConnectToData(String dsn) { System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection(); //conn.ConnectionString = "FIL=MS Access;DSN=" + dsn; conn.ConnectionString = "DSN=" + dsn; //dsn equals "Company_Shared" try { conn.Open(); MessageBox.Show("Connected!"); lstBoxLogs.Items.Add("Connected"); DataTable tableschema = conn.GetSchema("TABLES"); DataSet set = tableschema.DataSet; // first column name for (int i = 0; i < tableschema.Columns.Count; i++) { lstBoxLogs.Items.Add(tableschema.Columns[i].ColumnName); } lstBoxLogs.Refresh(); MessageBox.Show(tableschema.Columns.Count + " tables found"); } catch (Exception ex) { MessageBox.Show("Failed to connect to data source: " + ex.GetBaseException().Message); } finally { conn.Close(); } }
它连接正常,并报告表,但不报告我在数据库中查找的表,返回的内容如下:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS
TABLE_QUALIFIER
TABLE_OWNER
TABLE_NAME
TABLE_TYPE
REMARKS
我不确定如何从此信息中获取实际的表名,因此我只能转储每个表中的所有数据(这是我要做的全部)。这是因为我必须阅读transoft数据库使用哪种SQL,它会使conn.GetSchema("TABLES");调用无用吗?
conn.GetSchema("TABLES");
这行得通吗?
using(DataTable tableschema = conn.GetSchema("TABLES")) { // first column name foreach(DataRow row in tableschema.Rows) { lstBoxLogs.Items.Add(row["TABLE_NAME"].ToString()); } }
编辑: 修复了不使用数据集的代码。
编辑: 更新了代码,以供将来的读者实施处置的最佳实践DataTable。
DataTable