C# '当不存在数据时读取的尝试无效。'
我正在使用C编写WinForms。我制作了一个包含视频的课堂视频。此方法从SQL数据库读取数据并将其添加到imagelist和listview中 首先,我已上载图像,然后使用以下方法获取图像的位置: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,
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);