Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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# 如何在保存到数据库时跳过listview行?_C#_Mysql - Fatal编程技术网

C# 如何在保存到数据库时跳过listview行?

C# 如何在保存到数据库时跳过listview行?,c#,mysql,C#,Mysql,这是我在c#中将listview项保存到mysql数据库中的代码。。。如果listview行上没有插入数据,如何跳过该行?我有点不知道我要在哪里插入If语句。。有人喜欢吗 for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++) { string query = "insert into results(sid,c_id)values('" + _studid + "','" + lv1.Items[cnt].SubItems[2].

这是我在c#中将listview项保存到mysql数据库中的代码。。。如果listview行上没有插入数据,如何跳过该行?我有点不知道我要在哪里插入If语句。。有人喜欢吗

for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++)
{
    string query = "insert into results(sid,c_id)values('" + _studid + "','" + lv1.Items[cnt].SubItems[2].Text + "')";

    conn.Open();
    MySqlCommand cmd = new MySqlCommand(query, conn);
    cmd.ExecuteNonQuery();
    conn.Close();


}

for(int cnt=0;cnt您只需检查项目的值是否为空即可

我建议您阅读有关参数化sql查询的内容


如果没有要添加的数据,此代码将跳过insert到数据库中,查询将使用now参数: 您可以在环路外打开和关闭连接,这无疑会提高性能

conn.Open();
for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++)
{
     if(lv1.Items[cnt].SubItems[2].Text=="")
         continue;
MySqlCommand m = new MySqlCommand(readCommand);
m.Parameters.Add(new MySqlParameter("@id", _studid));
m.Parameters.Add(new MySqlParameter("@val", lv1.Items[cnt].SubItems[2].Text));

    string query = "insert into results(sid,c_id)values(@id, @val)";

    MySqlCommand cmd = new MySqlCommand(query, conn);
    cmd.ExecuteNonQuery();
}
conn.Close();
conn.Open();

对于(int cnt=0;cnt从循环中提取所有代码以构建
MySqlCommand
,并初始化两个参数,第一个参数始终具有相同的值,而第二个参数则有所不同。因此,在循环中检查listview子项中的空值,如果不为空,则设置第二个参数的值。现在可以执行它随后的循环只需要更改第二个参数的值

string query = "insert into results(sid,c_id)values(@id, @cid))";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = _stuid;
cmd.Parameters.Add("@cid", MySqlDbType.Int32);

conn.Open();

for (int cnt = 0; cnt < lv1.Items.Count; cnt++)
{
    string subItem = lv1.Items[cnt].SubItems[2].Text;
    if(!string.IsNullOrWhiteSpace(subItem))
    { 
        cmd.Parameters["@cid"].Value = Convert.ToInt32(subItem);
        cmd.ExecuteNonQuery();
    }

}
conn.Close();
string query=“插入结果(sid,c_id)值(@id,@cid))”;
MySqlCommand cmd=新的MySqlCommand(查询,连接);
cmd.Parameters.Add(“@id”,MySqlDbType.Int32).Value=\u stuid;
cmd.Parameters.Add(“@cid”,MySqlDbType.Int32);
conn.Open();
对于(int cnt=0;cnt
通过这种方式,您只需打开一次连接,并在执行循环之前准备好命令。该命令使用参数化查询,因此它是安全的。
还可以看看没有引号和字符串连接的sql字符串如何更具可读性

最后说明:
我假设
c\u id
字段是一个数字字段。
我已将for…循环更改为更简单的形式。

这类代码导致使用事务来保持所有内容都是原子的(这意味着,如果一次插入失败,所有内容都应该回滚,而不会对数据库进行任何更改)。有关更多信息,请查看使用if条件和
continue
关键字,例如
if(lv1.Items[cnt]==string.Empty)continue;
此查询将暴露于注入。
如果(!string.IsNullOrWhiteSpace(lv1.Items[cnt].SubItems[2].Text)){continue;}
应该这样做,但更重要的是使用参数化查询。@JustinAizengard将查询更改为参数化查询,而不是更改答案。这只是从给定示例中复制和粘贴,但我同意这是完全不安全的。答案应该解决这一问题。如果没有代码,至少要向OP介绍该漏洞?不会是的,而不是串接字符串中的值(Sql注入、解析包含单引号的字符串的问题、解析日期格式、十进制分隔符等)您为您的值放置了一个占位符,准备了一个具有所需类型、大小和精度的参数,并让数据库代码确定如何正确使用所有这些信息
string query = "insert into results(sid,c_id)values(@id, @cid))";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = _stuid;
cmd.Parameters.Add("@cid", MySqlDbType.Int32);

conn.Open();

for (int cnt = 0; cnt < lv1.Items.Count; cnt++)
{
    string subItem = lv1.Items[cnt].SubItems[2].Text;
    if(!string.IsNullOrWhiteSpace(subItem))
    { 
        cmd.Parameters["@cid"].Value = Convert.ToInt32(subItem);
        cmd.ExecuteNonQuery();
    }

}
conn.Close();