如何用C++通过ADO.NET连接SQL数据库并实现数据读写
C++/CLI 下使用 ADO.NET 操作 SQL Server 数据库示例
由于ADO.NET是.NET框架的组件,C开发中需要使用**C/CLI(托管C++)**来调用ADO.NET API。以下是完整的读写示例代码,覆盖你需要的int、string、string、string、string、double、int、int数据类型操作:
前置准备
- 在Visual Studio中创建CLR控制台应用程序(确保项目支持托管代码)
- 确保项目引用了
System.Data程序集
完整代码示例
#using <System.dll> #using <System.Data.dll> #using <System.Xml.dll> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; int main() { // 替换为你的数据库连接信息 String^ connectionString = "Data Source=localhost;Initial Catalog=YourDatabase;User ID=sa;Password=YourPassword;"; // -------------------------- // 1. 插入数据 // -------------------------- try { SqlConnection^ conn = gcnew SqlConnection(connectionString); conn->Open(); // 参数化SQL,避免注入问题并适配数据类型 String^ insertSql = "INSERT INTO YourTable(Id, StrCol1, StrCol2, StrCol3, StrCol4, DoubleCol, IntCol1, IntCol2) " "VALUES(@Id, @StrCol1, @StrCol2, @StrCol3, @StrCol4, @DoubleCol, @IntCol1, @IntCol2)"; SqlCommand^ insertCmd = gcnew SqlCommand(insertSql, conn); // 绑定对应类型的参数 insertCmd->Parameters->Add(gcnew SqlParameter("@Id", SqlDbType::Int))->Value = 1001; insertCmd->Parameters->Add(gcnew SqlParameter("@StrCol1", SqlDbType::NVarChar, 50))->Value = "SampleText1"; insertCmd->Parameters->Add(gcnew SqlParameter("@StrCol2", SqlDbType::NVarChar, 50))->Value = "SampleText2"; insertCmd->Parameters->Add(gcnew SqlParameter("@StrCol3", SqlDbType::NVarChar, 50))->Value = "SampleText3"; insertCmd->Parameters->Add(gcnew SqlParameter("@StrCol4", SqlDbType::NVarChar, 50))->Value = "SampleText4"; insertCmd->Parameters->Add(gcnew SqlParameter("@DoubleCol", SqlDbType::Float))->Value = 66.66; insertCmd->Parameters->Add(gcnew SqlParameter("@IntCol1", SqlDbType::Int))->Value = 2024; insertCmd->Parameters->Add(gcnew SqlParameter("@IntCol2", SqlDbType::Int))->Value = 12; int affectedRows = insertCmd->ExecuteNonQuery(); Console::WriteLine("插入成功,影响行数: {0}", affectedRows); conn->Close(); } catch (Exception^ ex) { Console::WriteLine("插入失败: {0}", ex->Message); } // -------------------------- // 2. 按需读取数据(按ID查询) // -------------------------- try { SqlConnection^ conn = gcnew SqlConnection(connectionString); conn->Open(); String^ selectSql = "SELECT Id, StrCol1, StrCol2, StrCol3, StrCol4, DoubleCol, IntCol1, IntCol2 " "FROM YourTable WHERE Id = @TargetId"; SqlCommand^ selectCmd = gcnew SqlCommand(selectSql, conn); selectCmd->Parameters->Add(gcnew SqlParameter("@TargetId", SqlDbType::Int))->Value = 1001; SqlDataReader^ reader = selectCmd->ExecuteReader(); while (reader->Read()) { // 按字段索引读取对应类型数据,也可使用列名:reader->GetInt32(reader->GetOrdinal("Id")) int id = reader->GetInt32(0); String^ str1 = reader->GetString(1); String^ str2 = reader->GetString(2); String^ str3 = reader->GetString(3); String^ str4 = reader->GetString(4); double doubleVal = reader->GetDouble(5); int int1 = reader->GetInt32(6); int int2 = reader->GetInt32(7); Console::WriteLine("\n读取到数据:"); Console::WriteLine("Id: {0}, Str1: {1}, Str2: {2}", id, str1, str2); Console::WriteLine("Str3: {0}, Str4: {1}, Double: {2}", str3, str4, doubleVal); Console::WriteLine("Int1: {0}, Int2: {1}", int1, int2); } reader->Close(); conn->Close(); } catch (Exception^ ex) { Console::WriteLine("读取失败: {0}", ex->Message); } Console::ReadLine(); return 0; }
关键注意事项
- 替换代码中的
connectionString、表名(YourTable)、列名为你的实际数据库信息 - 参数化查询是必须的:既可以避免SQL注入,也能自动处理不同数据类型的转换
- 读取数据时,确保字段的索引/列名与数据库表结构一致,类型不匹配会抛出异常
- 操作完成后务必关闭
SqlConnection和SqlDataReader,避免资源泄漏
内容的提问来源于stack exchange,提问作者Kito
相关产品推荐
相关产品推荐

