SqlDataAdapter 未加载数据表 - C++

SqlDataAdapter not loading datatable - C++

本文关键字:C++ 数据表 加载 SqlDataAdapter      更新时间:2023-10-16

但是,我一直在尝试将SQL数据库加载到C++的数据表中;它似乎不想工作。不过,连接正在工作,因为DataReader工作。这是我的代码

void importDatabase() {
SqlConnection con;
SqlDataAdapter^ da;
SqlCommand cmd;
DataTable^ dt;
int count = 1;
try {
con.ConnectionString = "Data Source=MYNAME\SQLEXPRESS;Initial Catalog=VinylRecords;Integrated Security=True"; 
cmd.CommandText = "SELECT * FROM Records";
cmd.Connection = %con;
con.Open();
da = gcnew SqlDataAdapter(%cmd);
dt = gcnew DataTable("Records");
Console::Write(da->ToString());
da->Fill(dt);
for (int i = 0; i < dt->Rows->Count - 1; i++) {
String^ value_string;
value_string = dt->Rows[i]->ToString();
Console::WriteLine(dt->Rows[i]->ToString());
count++;
}
cout << "There are " << count << " many records";
}
catch (Exception^ ex) {
Console::WriteLine(ex->ToString());
}
}

请注意,我稍微更改了源名称以在此处发布,但仅第一部分。 我的代码有什么问题?

所以,问题就在这里:

dt->Rows[i]->ToString()

Rows[i] 是一个 Row 对象。Row 类的 ToString() 方法总是打印出完全限定的 typename,这就是你所看到的。所以这在技术上工作得很好。你需要做的是:你需要访问该行中的特定列并获取它的值,然后输出它。

大致如下:

foreach (DataRow dr in dt.Rows)
{
Console.Write(dr.Field<int>("ColumnOne"));
Console.Write(" | ");
Console.WriteLine(dr.Field<string>("ColumnTwo"));
}

我不完全确定使用 C++\CLI 时访问 DataTable 内部特定单元格的语法。因此,我提供了等效的 C# 来解释为什么您获得托管类型名称(例如"System.Data.DataRow")的输出,而不是 Row 列内的信息。

另外,我注意到您用"mysql"标记了这个问题,但您使用的是 ADO.NET System.Data.SqlClient命名空间。SqlDataReader 和 SqlDataAdapter 类仅适用于 TSQL(Microsoft 的 SQL Server 数据库)如果您实际连接到 mysql 数据库,则需要使用 System.Data.OdbcDataAdapter 类。您可以在此处阅读更多内容:https://msdn.microsoft.com/en-us/library/ms254931.aspx