以下代码
- 应按照@Olivier Rogier 的建议创建参数作为参数。
- 不使用 DataAdapter,将其视为本地 var 表明这一点。请改用命令对象。
- 请注意,如果没有错误,则返回类型带有 DataTable,而如果引发运行时异常,则将 Exception 传递回调用者。
- 建议不要使用 SELECT *(不是问题的一部分,但最好只问需要的,不要再问了)。
代码
public class DataOperations
{
private static string connection = "Data Source=.\\sqlexpress;Initial Catalog=NorthWind2020;Integrated Security=True";
public static (DataTable table, Exception exception) SelectRow(string contactId)
{
DataTable table = new DataTable();
try
{
using (var cn = new SqlConnection { ConnectionString = connection })
{
using (var cmd = new SqlCommand { Connection = cn })
{
cmd.CommandText = "SELECT FirstName, LastName FROM dbo.Contacts WHERE ContactId = @contactId;";
cmd.Parameters.Add("@contactId", SqlDbType.NVarChar).Value = contactId;
cn.Open();
table.Load(cmd.ExecuteReader());
return (table, null);
}
}
}
catch (Exception exception)
{
return (null, exception);
}
}
}
上面调用方法的示例代码。
var (dataTable, exception) = DataOperations.SelectRow(contactIdentifier);
if (exception == null)
{
Debug.WriteLine("Use table");
}
else
{
Debug.WriteLine(exception.Message);
}
此外,如果联系人标识符指向单个记录,您可以简单地传回单个 DataRow 而不是整个 DataTable 或使用类的单个实例,例如
public class Contact
{
// seems this would be an int
public string ContactId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() => $"{FirstName} {LastName}";
}
获取数据的代码
public static Contact SelectContact(string contactId)
{
Contact contact = new Contact() {ContactId = contactId};
using (var cn = new SqlConnection { ConnectionString = connection })
{
using (var cmd = new SqlCommand { Connection = cn })
{
cmd.CommandText = "SELECT FirstName, LastName FROM dbo.Contacts WHERE ContactId = @contactId;";
cmd.Parameters.Add("@contactId", SqlDbType.NVarChar).Value = contactId;
cn.Open();
var reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
contact.FirstName = reader.GetString(0);
contact.LastName = reader.GetString(1);
}
}
}
return contact;
}