Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中存储来自SQL的结果_C#_Sql - Fatal编程技术网

C# 在C中存储来自SQL的结果

C# 在C中存储来自SQL的结果,c#,sql,C#,Sql,我正在尝试运行SQL查询以收集数据并写入数组。我希望能够使用此数组在以后运行一些if语句,以查看检索到的数据是否满足所需的某些要求。我是C的新手,如果有更好的方法,请告诉我正确的方向。以下是我到目前为止的情况: public static class DBconnect { static void Main() { Application.EnableVisualStyles(); Application

我正在尝试运行SQL查询以收集数据并写入数组。我希望能够使用此数组在以后运行一些if语句,以查看检索到的数据是否满足所需的某些要求。我是C的新手,如果有更好的方法,请告诉我正确的方向。以下是我到目前为止的情况:

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)