查询以验证C#中是否已存在文件

时间:2016-12-12 10:18:17

标签: c# datagridview

我有一个DataGridView,我可以从中选择一些行并将其插入另一个DataGridView,删除原始DataGridView中的行。要做到这一点,我会做一些验证,看看是否有一个相同的名称文件或类似的东西。

这是我在转移Button中使用的代码:

foreach (DataGridViewRow dtrow2 in frm.dataGridView2.Rows)
{
    con = new SqlConnection(cs.DBConn);
    con.Open();
    string querySelect = "SELECT FileName FROM SentRecycle WHERE FileName ='" + dtrow2.Cells[2].Value.ToString() + "'";
    cmd = new SqlCommand(querySelect);

    frm.ShowDataGridView();
    cmd.Connection = con;

    reader = cmd.ExecuteReader();

    if (reader.Read() == true)
    {
        MessageBox.Show("This file already in use!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);

        if ((reader != null))
        {
            reader.Close();
        }
        return;
    }
}

但我无法删除它,因为当我将重复的文件放入测试应用程序时,它总是会查找第一行而不检查其他行。你知道我怎么解决它?

2 个答案:

答案 0 :(得分:2)

return语句会导致foreach在第一场比赛后停止 调用return将退出它所在的方法,而不管可能正在执行的任何循环,这是导致问题的原因。

另外,其他一些评论:
  - 该消息未说明正在使用哪个文件   - 对于正在使用的十几个文件,会显示十几个弹出窗口   - 您不需要为每个查询创建新连接,一个就足够了   - 使用SqlParameter比将文件名连接到查询更好,更安全。

结果看起来像这样:

public bool AreFilesInUse()
{
    var FilesInUse = new List<string>();
    con = new SqlConnection(cs.DBConn);
    con.Open();
    var sql = "SELECT FileName FROM SentRecycle WHERE FileName = @file";
    cmd = new SqlCommand(sql);
    cmd.Parameters.Add("@file", SqlDbType.NVarChar);
    cmd.Connection = con;

    foreach (DataGridViewRow dtrow2 in frm.dataGridView2.Rows)
    {
        var file = dtrow2.Cells[2].Value.ToString();
        cmd.Parameters["@file"].Value = file;

        // frm.ShowDataGridView(); // does not seem useful here, maybe before the loop

        var reader = cmd.ExecuteReader();
        if (reader.Read())
            FilesInUse.Add(file);  // remember file name

        reader.Close();
    }

    bool foundAny = FilesInUse.Count > 0;
    if (foundAny)
    {
        var files = string.Join("\r\n", FilesInUse);
        MessageBox.Show("The following files are already in use:\r\n" + files, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    con.Close();
    return foundAny;
}

}

答案 1 :(得分:1)

这是因为您不允许您的代码检查:)循环中的所有行。删除foreach关键字并检查其他关键字。如果您在其他地方需要这些文件名,请将它们放在列表或类似的内容中。还检查文件名是否为空或空以处理异常。检查一下:

return