C# '当不存在数据时读取的尝试无效。'

C# '当不存在数据时读取的尝试无效。',c#,sql-server,winforms,class,C#,Sql Server,Winforms,Class,我正在使用C编写WinForms。我制作了一个包含视频的课堂视频。此方法从SQL数据库读取数据并将其添加到imagelist和listview中 首先,我已上载图像,然后使用以下方法获取图像的位置: var=open.FileName.ToString(); 然后在uploadvideo函数中,我将图像转换为bytearray并将其插入数据库: public void uploadvideo(string url, string path, string name,string title,

我正在使用C编写WinForms。我制作了一个包含视频的课堂视频。此方法从SQL数据库读取数据并将其添加到imagelist和listview中

首先,我已上载图像,然后使用以下方法获取图像的位置:

var=open.FileName.ToString();
然后在uploadvideo函数中,我将图像转换为bytearray并将其插入数据库:

public void uploadvideo(string url, string path, string name,string title, DateTime date, string imgloc, string user)
        {
            con.Open();
            FileStream file = new FileStream(imgloc,FileMode.Open,FileAccess.Read);
                BinaryReader br = new BinaryReader(file);
                byte[] img = br.ReadBytes((int)file.Length);
           cmd = new SqlCommand($"insert into RecipeInfo (RecipeName, [Recipe Link],Thumbnail,Username, Date, Title) values ('{name}','{path}','@img','{user}','{date}','{title}')", con);
                        cmd.ExecuteNonQuery();
        }

然后是我检索数据的函数

public void yourvideos(string user, ImageList imglist, ListView list, Label l)
{
    cmd = new SqlCommand($"select Title, Thumbnail from RecipeInfo where username='{user}'", con);
    con.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    if (reader.HasRows)
    {
        while (reader.HasRows)
        {
            byte[] img = (byte[])(reader[2]);
            MemoryStream ms = new MemoryStream(img);
            imglist.Images.Add(Image.FromStream(ms));
            list.Items.Add(reader[5].ToString());
            //MessageBox.Show("Data presesnt");
        }
    }
    else
    {

        l.Visible = true;
        l.Text = "Upload videos and share your recipes with others";
    }
    reader.Close();
    con.Close();
}
此函数在button click事件下的表单中调用

v1.yourvideos(Form2.setname, imageList1, yourvideoslistview, messagelabel);
现在的问题是,控件enter in if语句表示存在数据,但不读取数据并显示错误:

当不存在数据时尝试读取无效

我如何解决这个问题?
我展示了一个messagebox,以确认if语句正常工作,但没有检索到数据。

首先,我不想修改获取数据的方法,因为这里有很多问题,但您可以在其他SO Q中获得帮助

当您仅选择2列数据时,无法在位置5返回索引

list.Items.Add(reader[5].ToString());
将此更改为类似以下内容:

list.Items.Add(reader["Title"].ToString());
将SELECT语句中的任何其他内容替换为“Title”

我也会改变:

while (reader.HasRows)

编辑 为了修复SQL语句中不起作用的部分,我建议使用SQL命令参数。首先,更新查询的这一部分

username='{user}'
对此

用户名=@username

接下来,您需要将其设置为命令参数,方法是在con.Open之前的行中添加以下内容

cmd.Parameters.AddWithValue("@username", user);

Read Errad。Read RealRe.HARS将永远不会结束:如果它有行读取,行不会消耗它们。也考虑尽快使用参数化查询。以这种方式将用户变量放入查询文本将打开Sql注入的大门您可以从RecipeInfo[…]选择标题、缩略图。所以您正在检索两个字段。如果只有两个字段0和1,您如何获得reader[5]?为什么不按字段名编制索引?不,当然不是。查询将从数据库中返回您请求的列中的行。那是你的参考资料,不是整个数据库。如果有跨表/跨数据库查询,会发生什么?如何确定这些列的索引?无论如何,您可以使用列/字段名作为索引器:例如,reader[Title]。这些名称是查询中使用的名称,因为您可以使用别名。我已进行了所有更改,但出现了一个新错误“参数无效”。在我的数据库中,我已将图像的数据类型设置为图像。请检查我对原始帖子的编辑,以了解您应该更新的其他内容。这可能是它抱怨的参数,但是如果不是,请发布更多的细节来帮助解决问题。我包含更多细节。我已经将其更改为参数化查询,但仍然是相同的错误
cmd.Parameters.AddWithValue("@username", user);