2014-09-30 100 views
0

我需要在C#中的一个SQL表中搜索一个值(文件名)。如果它存在返回TRUE,并且如果不返回FALSE并继续我的代码基于此。在SQL中搜索结果表

这是我有什么,但它不工作:

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

如果你想得到适当的帮助,你应该定义“不工作”。没有结果?查询会引发异常? ... – Conduit 2014-09-30 17:36:51

+0

请注明这是SQL Server或MySQL – Steve 2014-09-30 17:37:46

+0

原始查询:WHEN EXISTS SELECT CASE( SELECT * FROM [DBO] [文件] 其中FileName = 'SomeFileName') 再投(1 AS BIT)ELSE CAST(0 AS BIT) 的作品。但是当我试图从C#执行它时,我无法实现它的工作。 – user3853986 2014-09-30 17:39:00

回答

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 
} 

//如果您可以检查物理文件是否存在于目录中,则不需要DB调用。文件检查 - System.IO.File.Exists("PathToFile")

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返回执行查询的第一行的第一列。

+0

感谢您的帮助。 – user3853986 2014-09-30 18:18:42