C# 使用Ado.net读取Ms Access
我正在读一个C语言的数据库Ms Access。我正在使用Ado.net进行连接。这个数据库有很多大约100个表,每个表大约有50列和500行。每个字段都包含不同的数据类型integer、string和bool。我要做的是将选定的表和字段转换为二进制格式 在一些文献调查之后,我计划使用“DataReader”读取数据,因为我只需要读取二进制转换的变量 我的问题是 在C编程方面,我的数据结构应该是什么?比如说,如果我为所有表创建单独的类,并定义成员变量和方法,那么如何使其更有效?。因为我已经提到有100个表和50个字段,实际上我不需要选择所有的字段,我只需要选择所需的字段。我不想像这样硬编码C# 使用Ado.net读取Ms Access,c#,sql,database,ado.net,ms-access-2007,C#,Sql,Database,Ado.net,Ms Access 2007,我正在读一个C语言的数据库Ms Access。我正在使用Ado.net进行连接。这个数据库有很多大约100个表,每个表大约有50列和500行。每个字段都包含不同的数据类型integer、string和bool。我要做的是将选定的表和字段转换为二进制格式 在一些文献调查之后,我计划使用“DataReader”读取数据,因为我只需要读取二进制转换的变量 我的问题是 在C编程方面,我的数据结构应该是什么?比如说,如果我为所有表创建单独的类,并定义成员变量和方法,那么如何使其更有效?。因为我已经提到有1
SELECT BusinessEntityID, LoginID, NationalIDNumber from table1Name
因为我必须遍历代码中提到的选定表和选定字段。由于我对SQL有点陌生,您能提供一些提示吗?另一方面,如果我问如何使select查询对表和字段的变量有效,请纠正我,如果这个问题有任何错误
更新
下面提到了类似的内容
拥有如您所述的大量字段,首先使用OleDb读取SchemaTable可能会很有用: 清单1。获取SchemaTable可选 清单2。从MS Access数据库表读取数据 从MS Access数据库表读取数据并使用DataAdapter OleDb对象在DataSet中填充DataTable的实际过程如下所示。它最初封装在我的自定义DB操作类中,如语法所示,因此您可以根据需要修改它:
#region DataSet, DataAdapter, DataTable
internal DataSet dataSet;
internal OleDbDataAdapter dataAdapter;
internal DataTable dataTable;
private OleDbConnection connection;
#endregion
internal GetData(string SelectQuery, string ConnectionString)
{
try
{
#region Create Data Objects: Connection, DataAdapter, DataSet, DataTable
// use OleDb Connection to MS Access DB
connection = new OleDbConnection(ConnectionString);
connection.Open();
// create new DataAdapter on OleDb Connection and Select Query text
dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = new OleDbCommand(SelectQuery, connection);
// create DataSet
dataSet = new DataSet();
// retrieve TableSchema
// DataTable[] _dataTablesSchema = _dataAdapter.FillSchema(_dataSet, SchemaType.Source, "{TABLE NAME}");
DataTable[] _dataTablesSchema = dataAdapter.FillSchema(dataSet, SchemaType.Source);
// there is only one Table in DataSet, so use 0-index
dataTable = _dataTablesSchema[0];
// use DataAdapter to Fill Dataset
dataAdapter.Fill(dataTable);
// OPTIONAL: use OleDbCommandBuilder to build a complete set of CRUD commands
OleDbCommandBuilder builder = new OleDbCommandBuilder(dataAdapter);
// Update, Insert and Delete Commands
dataAdapter.UpdateCommand = builder.GetUpdateCommand();
dataAdapter.InsertCommand = builder.GetInsertCommand();
dataAdapter.DeleteCommand = builder.GetDeleteCommand();
#endregion
connection.Close();
}
catch {throw; }
}
有关更多详细信息,请参阅MSDN上的帖子:链接
注意:清单1中的第一步是可选的。这两个程序都基于OleDb对象在MS Access DB上运行。对于其他数据库类型,例如MS SQL server,有不同的对象集,如SQLConnection等。我必须读取每个字段,并将所有字段写入二进制字段。-说什么?也许你应该说明你正试图解决的实际问题,而不是一个设想的解决方案…@MitchWheat,实际的要求是,我必须将Ms Access数据库内容转换为二进制文件。这是一个解决方案。要求将可查询数据库转换为二进制blob的原因是什么?@MitchWheat这是为了某种保护。由于我的客户在技术上没有能力,他们无法直接读取数据。所以我认为这就足够了。为什么不干脆把数据库压缩一下呢?这也是一个不可读的二进制文件,特别是如果你在上面加了密码。
#region DataSet, DataAdapter, DataTable
internal DataSet dataSet;
internal OleDbDataAdapter dataAdapter;
internal DataTable dataTable;
private OleDbConnection connection;
#endregion
internal GetData(string SelectQuery, string ConnectionString)
{
try
{
#region Create Data Objects: Connection, DataAdapter, DataSet, DataTable
// use OleDb Connection to MS Access DB
connection = new OleDbConnection(ConnectionString);
connection.Open();
// create new DataAdapter on OleDb Connection and Select Query text
dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = new OleDbCommand(SelectQuery, connection);
// create DataSet
dataSet = new DataSet();
// retrieve TableSchema
// DataTable[] _dataTablesSchema = _dataAdapter.FillSchema(_dataSet, SchemaType.Source, "{TABLE NAME}");
DataTable[] _dataTablesSchema = dataAdapter.FillSchema(dataSet, SchemaType.Source);
// there is only one Table in DataSet, so use 0-index
dataTable = _dataTablesSchema[0];
// use DataAdapter to Fill Dataset
dataAdapter.Fill(dataTable);
// OPTIONAL: use OleDbCommandBuilder to build a complete set of CRUD commands
OleDbCommandBuilder builder = new OleDbCommandBuilder(dataAdapter);
// Update, Insert and Delete Commands
dataAdapter.UpdateCommand = builder.GetUpdateCommand();
dataAdapter.InsertCommand = builder.GetInsertCommand();
dataAdapter.DeleteCommand = builder.GetDeleteCommand();
#endregion
connection.Close();
}
catch {throw; }
}