Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Ado.net读取Ms Access_C#_Sql_Database_Ado.net_Ms Access 2007 - Fatal编程技术网

C# 使用Ado.net读取Ms Access

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

我正在读一个C语言的数据库Ms Access。我正在使用Ado.net进行连接。这个数据库有很多大约100个表,每个表大约有50列和500行。每个字段都包含不同的数据类型integer、string和bool。我要做的是将选定的表和字段转换为二进制格式

在一些文献调查之后,我计划使用“DataReader”读取数据,因为我只需要读取二进制转换的变量

我的问题是

在C编程方面,我的数据结构应该是什么?比如说,如果我为所有表创建单独的类,并定义成员变量和方法,那么如何使其更有效?。因为我已经提到有100个表和50个字段,实际上我不需要选择所有的字段,我只需要选择所需的字段。我不想像这样硬编码

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; }
}