C# 在C中存储来自SQL的结果
我正在尝试运行SQL查询以收集数据并写入数组。我希望能够使用此数组在以后运行一些if语句,以查看检索到的数据是否满足所需的某些要求。我是C的新手,如果有更好的方法,请告诉我正确的方向。以下是我到目前为止的情况:C# 在C中存储来自SQL的结果,c#,sql,C#,Sql,我正在尝试运行SQL查询以收集数据并写入数组。我希望能够使用此数组在以后运行一些if语句,以查看检索到的数据是否满足所需的某些要求。我是C的新手,如果有更好的方法,请告诉我正确的方向。以下是我到目前为止的情况: public static class DBconnect { static void Main() { Application.EnableVisualStyles(); Application
public static class DBconnect
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public static void sqlConnect()
{
var qSql = "Select con.FIRSTNAME, Con.LASTNAME, Con.EMAIL, Act.USERFIELD1 'SerialNumber', ACT.ACCOUNT, TTC.SOFTWAREMAINTENANCE, TTC.HARDWAREMAINTENANCE " +
"from CONTACT CON Inner join ACCOUNT ACT on ACT.ACCOUNTID = CON.ACCOUNTID " +
"Inner join TTCONTRACTS TTC on TTC.ACCOUNTID = ACT.ACCOUNTID " +
"Where Con.EMAIL is not null and Act.USERFIELD1 is not null and " +
"ISNUMERIC(Act.USERFIELD1) = 1 and con.EMAIL like '%@%'";
//Creates connection to sql database
string connectionString = null;
SqlConnection cnn;
connectionString = @"Data Source=DESKTOP-MO813OQ\SalesLogic; Initial Catalog=SalesLogix_Pull; Integrated Security = True";
cnn = new SqlConnection(connectionString);
//Sql command to run the query's
SqlCommand query = new SqlCommand(qSql, cnn);
QueryResults[] allRecords = null;
using (query)
{
cnn.Open();
using (var reader = query.ExecuteReader())
{
var list = new List<QueryResults>();
while (reader.Read())
list.Add(new QueryResults
{
FIRSTNAME = reader.GetString(0),
LASTNAME = reader.GetString(1),
EMAIL = reader.GetString(2),
SERIALNUMBER = reader.GetInt32(3),
ACCOUNT = reader.GetString(4),
USERFIELD1 = reader.GetInt32(5),
SOFTWAREMAINTENANCE = reader.GetBoolean(6),
HARDWAREMAINTENANCE = reader.GetBoolean(7)
});
allRecords = list.ToArray();
}
try
{
cnn.Close();
MessageBox.Show("Connection Closed");
}
catch (Exception)
{
MessageBox.Show("Error has occured.");
}
}
}
}
运行此操作时,通常会出现以下错误:
在System.Data.dll的这部分代码中发生了类型为“System.InvalidCastException”的未处理异常:
list.Add(new QueryResults
{
FIRSTNAME = reader.GetString(0),
LASTNAME = reader.GetString(1),
EMAIL = reader.GetString(2),
SERIALNUMBER = reader.GetInt32(3),
ACCOUNT = reader.GetString(4),
USERFIELD1 = reader.GetInt32(5),
SOFTWAREMAINTENANCE = reader.GetBoolean(6),
HARDWAREMAINTENANCE = reader.GetBoolean(7)
});
任何帮助或指点都将不胜感激 您的某些数据列可能没有返回预期的输出,例如空值 试试这个
if(!reader.IsDBNull(colIndex))
return reader.GetString(colIndex);
else
return string.Empty;
如果这不起作用,您可以尝试调试哪个列有问题,并向我提供更多信息
希望有帮助。对于其中至少一种,您从SqlDataReader读取的数据类型与您用于读取它的方法不匹配。换句话说,您可能正在使用.GetInt32读取varchar值 最简单的方法是查看源表并查看列,以确保从中选择的每一列都包含预期的类型。如果没有,请查看是否可以在查询中强制转换它。USERFIELD1看起来可疑,因为您正在检查它是否是数字,这意味着它不是int。在查询中,您可以更改
Act.USERFIELD1 'SerialNumber'
到
我不喜欢读卡器硬编码索引,以防我搞砸了计数,或者选择更改 对所有集合初始值设定项行尝试此格式
SERIALNUMBER = reader.GetInt32(reader.GetOridinal("SerialNumber"))
而不是
SERIALNUMBER = reader.GetInt32(3)
如果这没有帮助,我会仔细检查数据库中的实际列定义,并确保它们是您期望的类型。异常清楚地表明无效强制转换异常。数据库中存储的数据的格式/数据类型与C中的转换不匹配。请将所有数据库列类型与您的C属性类型进行比较。看起来像是ORM的作业。我喜欢EF 6或EF Core,但有很多ORM可用。布尔或数字列中有可以为空的吗?如果是这样,您将在尝试将DbNull.Value强制转换为这些类型时遇到问题。列类型是什么?错误是因为您试图为列获取错误类型的数据。存储在而不是数组中怎么样?DataTable也是为了这个目的而存在的,它们将数据存储在内存中。我查看了所有这些数据,发现有一些是错误的。它们不是char就是varchar。我现在将它们都更改为字符串,但仍然会遇到相同的错误。我尝试了一下,但它在返回时给了我一个错误,因为DBconnect.sqlConnect返回void,所以返回关键字后面不能跟对象表达式。抱歉,如果这是一个愚蠢的问题,但我不太明白它在问什么。你是对的USERFIELD1是一个字符而不是一个int,当我进行更改时,你建议它停止运行查询。谢谢你的反馈!
SERIALNUMBER = reader.GetInt32(reader.GetOridinal("SerialNumber"))
SERIALNUMBER = reader.GetInt32(3)