c#OdbcDataReader的数据读取

先有如下c#示例代码:

string strconnect = "DSN=custom;UID=sa;PWD=123456;"

OdbcConnection odbc = new OdbcConnection(strconnect);

odbc.Open();

if (odbc.State != System.Data.ConnectionState.Open)

{

   return;

}

string strSql = "select ID from mytable";

OdbcCommand odbcCmd = new OdbcCommand(strSql, odbc);

OdbcDataReader dtReader = odbc.ExecuteReader();

// 数据库里确保mytable中是有数据的

int tableid = (int)dtReader["ID"];

以上代码有时候正常运行,有时候在最后一行会提示:

System.InvalidOperationException: '不存在此行/列的数据。'

但实际上出现上面问题崩溃时,查看dtReader是可以看到里面有数据的。然后改成索引也是一样:

int tableid = (int)dtReader[0];

有时候成功,有时候失败崩溃。

通过查看帮助说明,有大致这样的描述:如果是流,在读取时可能数据还未到达。

这个意思就是在执行完语句之后立即获取其中的数据,有可能数据流还未到达,所以这个读取就会失败,也就是“列”还不存在导致崩溃。为了解决这个问题,必需先Read()一次:

dtReader.Read();

int tableid = (int)dtReader["ID"];

添加Read()之后,问题解决。

<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[4]提到了C#中文件读写的方式,包括使用FileStream、BinaryReader、BinaryWriter以及文本读写器(如StreamReader和StreamWriter)。同时,引用[2][3][5]提到了数据库操作,包括SQLite和MySQL等。 用户的问题是关于C#数据读写方法,包括文件操作和数据库操作。因此,我们将从这两个方面展开: 一、文件操作 1. 文本文件读写 2. 二进制文件读写 二、数据库操作 1. SQLite数据库操作 2. SQL Server数据库操作(由于引用中提到了ODBC,也可以提一下MySQL,但主要根据引用[5]) 我们将按照这个结构,结合引用内容,给出代码示例和说明。 注意:引用[5]中给出了使用ODBC连接MySQL的示例,但其中有一些拼写错误(如OdbcConection应为OdbcConnection,OdbcDaAdapter应为OdbcDataAdapter),我们将在代码中修正。 另外,根据引用[1]和引用[4],二进制文件读写使用BinaryReader和BinaryWriter,文本文件读写使用StreamReader和StreamWriter。 下面开始组织回答。</think>### C# 数据读写方法详解(文件与数据库) 以下是 C# 中文件与数据库操作的完整解决方案,结合文本/二进制文件读写和主流数据库操作: --- #### 一、文件读写操作 **1. 文本文件读写** ```csharp // 写入文本文件 File.WriteAllText("config.txt", "用户名: admin\n密码: 123456"); // 读取文本文件 string content = File.ReadAllText("config.txt"); Console.WriteLine(content); ``` *特点:适合简单配置存储,单次操作整个文件[^1]* **2. 二进制文件读写** ```csharp // 使用 BinaryWriter 写入 using (var stream = new FileStream("data.bin", FileMode.Create)) using (var writer = new BinaryWriter(stream)) { writer.Write(42); // int writer.Write(3.14); // double writer.Write("二进制数据"); // string } // 使用 BinaryReader 读取 using (var stream = new FileStream("data.bin", FileMode.Open)) using (var reader = new BinaryReader(stream)) { int num = reader.ReadInt32(); double pi = reader.ReadDouble(); string text = reader.ReadString(); } ``` *特点:高效处理原始字节数据,适合大型文件[^4]* --- #### 二、数据库操作 **1. SQLite 数据库操作** ```csharp using Microsoft.Data.Sqlite; // 创建连接 using (var connection = new SqliteConnection("Data Source=mydb.db")) { connection.Open(); // 创建表 var createCmd = connection.CreateCommand(); createCmd.CommandText = "CREATE TABLE IF NOT EXISTS Users (Id INTEGER PRIMARY KEY, Name TEXT)"; createCmd.ExecuteNonQuery(); // 插入数据 var insertCmd = connection.CreateCommand(); insertCmd.CommandText = "INSERT INTO Users (Name) VALUES ($name)"; insertCmd.Parameters.AddWithValue("$name", "张三"); insertCmd.ExecuteNonQuery(); // 查询数据 var selectCmd = connection.CreateCommand(); selectCmd.CommandText = "SELECT * FROM Users"; using (var reader = selectCmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine($"{reader["Id"]}: {reader["Name"]}"); } } } ``` *特点:轻量级嵌入式数据库,无需单独服务器[^2]* **2. SQL Server 数据库操作** ```csharp using System.Data.SqlClient; // 连接字符串示例 string connStr = "Server=localhost;Database=TestDB;User Id=sa;Password=your_password;"; using (var conn = new SqlConnection(connStr)) { conn.Open(); // 参数化查询(防SQL注入) var cmd = new SqlCommand("SELECT * FROM Products WHERE Price > @minPrice", conn); cmd.Parameters.AddWithValue("@minPrice", 100.0); using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["ProductName"]); } } } ``` *特点:企业级数据库支持,完整事务处理[^3]* **3. MySQL 数据库操作(ODBC)** ```csharp using System.Data.Odbc; // 配置ODBC连接 string connStr = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=localhost;DATABASE=mydb;UID=root;PASSWORD=root;"; using (var conn = new OdbcConnection(connStr)) { conn.Open(); // 执行查询 var cmd = new OdbcCommand("SELECT * FROM Employees", conn); using (OdbcDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["EmployeeName"]); } } // 执行更新 var updateCmd = new OdbcCommand("UPDATE Employees SET Salary = Salary * 1.1 WHERE Department = 'IT'", conn); int rowsAffected = updateCmd.ExecuteNonQuery(); Console.WriteLine($"更新了 {rowsAffected} 条记录"); } ``` *注意:需先安装 MySQL ODBC 驱动程序[^5]* --- #### 三、最佳实践建议 1. **资源管理**:始终使用 `using` 语句确保文件/数据库连接及时释放 2. **异常处理**:对文件/数据库操作添加 `try-catch` 块 ```csharp try { // 文件/数据库操作 } catch (IOException ex) { Console.WriteLine($"文件错误: {ex.Message}"); } catch (SqlException dbEx) { Console.WriteLine($"数据库错误: {dbEx.Number}"); } ``` 3. **参数化查询**:防止 SQL 注入攻击 4. **连接池**:数据库连接默认启用连接池,避免频繁开关连接 --- ### 相关问题 1. 如何选择文本文件、二进制文件或数据库存储数据? 2. 使用 Entity Framework Core 操作数据库与原生 ADO.NET 有何区别? 3. 如何加密存储敏感数据(如密码)到文件或数据库? 4. 二进制序列化与 JSON/XML 序列化各有什么优缺点? 5. 如何处理数据库连接超时和并发冲突? [^1]: 文件流对象(FileStream)在读写字节时效率高,但处理其他类型数据较复杂 [^2]: SQLite 是轻量级嵌入式数据库,适合本地数据存储 [^3]: SqlConnection 建立数据库连接,SqlCommand 执行 SQL 语句 [^4]: BinaryReader/BinaryWriter 专门处理二进制数据,效率高于文本读写器 [^5]: MySQL ODBC 驱动需单独安装并配置数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值