我需要在C#中搜索SQL表中的值(文件名)。如果它存在则返回TRUE,如果不返回FALSE并继续我的代码。
这就是我所拥有的,但它不起作用:
SqlCommand cmdName = new SqlCommand("SELECT CASE WHEN EXISTS (SELECT * FROM [dbo].[Document] WHERE FileName = @NewFileName) THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) )", con);
{
cmdName.Parameters.AddWithValue("@NewFileName", NewFileName);
cmdName.ExecuteNonQuery();
}
有什么建议吗?
整个代码是为了防止用户将文件重命名为已存在于表中的文件。所以,如果有更好的方法,我会很感激帮助。
答案 0 :(得分:1)
使用IF EXISTS是最快的vay
string cmdText = @"IF EXISTS(SELECT 1 FROM [dbo].[Document] WHERE FileName = @NewFileName)
SELECT 1 ELSE SELECT 0"
SqlCommand cmdName = new SqlCommand(cmdText, con);
cmdName.Parameters.AddWithValue("@NewFileName", NewFileName);
int result = Convert.ToInt32(cmdName.ExecuteScalar());
if(result == 1)
Console.WriteLine("File exists");
当然你需要改变所谓的方法。 ExecuteNonQuery不适用于SELECT查询,因为返回值是INSERT / DELETE / UPDATE之类的操作更改或修改的行数。相反,ExecuteScalar返回执行的查询的第一行的第一列。
答案 1 :(得分:0)
您可以使用如下所示,这简化了SQL查询。
SqlCommand cmdName = new SqlCommand("SELECT 1 FROM [dbo].[Document] WHERE FileName = @NewFileName", con);
cmdName.Parameters.AddWithValue("@NewFileName", NewFileName);
var result = cmdName.ExecuteScalar();
if(result != null)
{
// implies data exist
}
或者你可以使用它。
SqlCommand cmdName = new SqlCommand("SELECT 1 FROM [dbo].[Document] WHERE FileName = @NewFileName", con);
cmdName.Parameters.AddWithValue("@NewFileName", NewFileName);
SqlDataReader sdr = cmdName.ExecuteReader();
if (sdr.HasRows && sdr.Read())
{
// implies data exist
}
//如果您可以检查物理文件是否存在于目录中,则不需要进行数据库调用。文件检查 - System.IO.File.Exists("PathToFile")