Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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# SqlDataReader.Read()在C中始终为false_C#_Sql - Fatal编程技术网

C# SqlDataReader.Read()在C中始终为false

C# SqlDataReader.Read()在C中始终为false,c#,sql,C#,Sql,我在本地数据库SHIPSHITID、ShipName、ShipLength中有一个表。我正在轮询HistID==主题的所有船舶的数据库,但从未输入whilereader.Read{}。另外,我的Ships表有多行,在另一个SO问题中看到了这个问题,所以我不确定为什么不能将结果存储到元组列表中。在Visual Studio 2015中单独执行查询将生成正确的结果 public List<Tuple<String, int>> getHistoricalShipLi

我在本地数据库SHIPSHITID、ShipName、ShipLength中有一个表。我正在轮询HistID==主题的所有船舶的数据库,但从未输入whilereader.Read{}。另外,我的Ships表有多行,在另一个SO问题中看到了这个问题,所以我不确定为什么不能将结果存储到元组列表中。在Visual Studio 2015中单独执行查询将生成正确的结果

     public List<Tuple<String, int>> getHistoricalShipList(int theme)
        {
            List<Tuple<String, int>> list = new List<Tuple<string, int>>();

            using (db)
            {
                   cmd = new SqlCommand(@"Select ShipName, ShipLength from Ships Where HistID=@theme", db);
                   cmd.Parameters.AddWithValue("@theme", theme);

                db.Open();

                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows) // always returning false
                {
                    //Loop through results
                    while (reader.Read())
                    {
                        String shipName = reader[0].ToString();
                        int shipLength = Convert.ToInt32(reader[1]);
                        list.Add(Tuple.Create(shipName, shipLength));
                    }
                }
                db.Close();
            }

            return list;
        }
编辑::按建议从查询中删除了单引号,但仍然存在相同的问题。

您的主题是int类型,并且您将其括在单引号中,就像它是字符串值一样。删除引号,但更重要的是,使用参数

永远不要使用字符串连接/字符串格式来构建SQL语句,您的代码很容易出错

没有返回任何行的原因是,您的字段HistID是数字类型,并且您试图通过将值括在单引号中与字符串值进行比较

您的主题是int类型,并且您将其括在单引号中,就像它是字符串值一样。删除引号,但更重要的是,使用参数

永远不要使用字符串连接/字符串格式来构建SQL语句,您的代码很容易出错


没有返回任何行的原因是,您的字段HistID是数字类型,并且您试图通过将值括在单引号中与字符串值进行比较

删除HasRows检查,只需使用.Read while循环;在某些情况下,关于HasRows的各种错误报告并不完全准确


除此之外,你可能在某个地方犯了错误。要么主题不是您所期望的,要么是一些环境错误,如命中错误的数据库。

删除HasRows检查,只使用.Read while循环;在某些情况下,关于HasRows的各种错误报告并不完全准确


除此之外,你可能在某个地方犯了错误。要么主题不是您所期望的,要么是一些环境错误,如命中错误的数据库。

HistID列的类型是什么?听起来像是基于名字的数字。顺便说一句,你应该经常使用。这种字符串连接容易受到攻击。代码中有太多东西,我不知道从哪里开始。检查您的使用块。您没有足够的数据,至少db的数据看起来可疑。对于查询,应该使用参数而不是字符串格式。当您在读取过程中有一个while循环时,使用ifhasRows没有任何意义。请使用参数化查询,而不是string.Format。生成的查询是否返回程序外的任何结果?是的,Vojtech,当我在VS中打开查询编辑器时,查询返回我需要它返回的结果。我是初学者,请原谅我糟糕的编码!HistID列的类型是什么?听起来像是基于名字的数字。顺便说一句,你应该经常使用。这种字符串连接容易受到攻击。代码中有太多东西,我不知道从哪里开始。检查您的使用块。您没有足够的数据,至少db的数据看起来可疑。对于查询,应该使用参数而不是字符串格式。当您在读取过程中有一个while循环时,使用ifhasRows没有任何意义。请使用参数化查询,而不是string.Format。生成的查询是否返回程序外的任何结果?是的,Vojtech,当我在VS中打开查询编辑器时,查询返回我需要它返回的结果。我是初学者,请原谅我糟糕的编码!附加值?哎哟哦,不!你的权利,我错过了。然而,我更新了这一行,我仍然是读者。阅读仍然是错误的。更新OP和您的更正。同意所有内容,但这是OP的实际问题;由于隐式转换,查询仍然可以工作。@SonerGönül如果在非可变长度或非歧义类型上使用AddWithValue,则AddWithValue没有问题。当然,对于字符串和字节[],我永远不会使用它,但对于int,这没有什么错。@ScottChamberlain是的,在这种情况下这不是问题,但作为一般建议,特别是显式指定DbType,使代码在我看来更具可读性和可理解性。AddWithValue?哎哟哦,不!你的权利,我错过了。然而,我更新了这一行,我仍然是读者。阅读仍然是错误的。更新OP和您的更正。同意所有内容,但这是OP的实际问题;由于隐式转换,查询仍然可以工作。@SonerGönül如果在非可变长度或非歧义类型上使用AddWithValue,则AddWithValue没有问题。当然,对于字符串和byte[]我永远不会使用它,但对于int,这并没有什么错。@ScottChamberlain是的,这在这种情况下不是问题,但作为一般建议,特别是显式指定DbType,在我看来,使代码更具可读性和可理解性。我讨厌犯这么大的错误。T
heme始终以0的形式传入,这在我的DB中不存在。我硬编码了一个1,它存在,问题解决了。非常感谢。我讨厌我犯这么大的错误。主题始终以0的形式传入,这在我的数据库中不存在。我硬编码了一个1,它存在,问题解决了。非常感谢。
cmd = new SqlCommand(string.Format(@"Select ShipName, ShipLength from Ships Where HistID={0}", theme), db);
cmd = new SqlCommand(@"Select ShipName, ShipLength from Ships Where HistID=@theme", db);
cmd.Parameters.AddWithValue("@theme", theme);
//Or more precise 
//cmd.Parameters.Add(new SqlParameter("@theme", SqlDbType.Int) {Value = theme});