C# 向SQL server查询返回有关搜索的字符串

C# 向SQL server查询返回有关搜索的字符串,c#,sql-server,C#,Sql Server,我试图找出正在上载的文件是否已经存在于服务器中。对我来说,一种方法是检查是否存在相同的文件名。然而,代码中的某些内容似乎不正确。我已经使用SSMS运行了该查询,它可以工作,但是当我将其放入Visual Studio时,返回类型是SQL.Data.Command,而不是实际的字符串本身。有人能给我指一下正确的方向吗 if (coda_file_upload.HasFile) { coda = Path.GetFileName(filePath); //gets the file name

我试图找出正在上载的文件是否已经存在于服务器中。对我来说,一种方法是检查是否存在相同的文件名。然而,代码中的某些内容似乎不正确。我已经使用SSMS运行了该查询,它可以工作,但是当我将其放入Visual Studio时,返回类型是SQL.Data.Command,而不是实际的字符串本身。有人能给我指一下正确的方向吗

if (coda_file_upload.HasFile)
{
    coda = Path.GetFileName(filePath);  //gets the file name
    using (connection = new SqlConnection(connection_string))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.Text;

        cmd.CommandText = "SELECT * FROM name_table WHERE file_name LIKE '%"+coda+"%' ";

        cmd.Connection = connection;
        connection.Open();
        cmd.ExecuteNonQuery();
        connection.Close();

        string sample = Convert.ToString(cmd);

        if (cmd.ToString().Equals(String.Empty))
        {
            coda_file_upload.SaveAs(Server.MapPath("~/") + coda);
            input_data = System.IO.File.ReadAllText(Server.MapPath("~/") + coda);
            parse_CODA(input_data, coda);

            testing.Text = "Success";
        }

        else
            testing.Text = "File exists, please try another file.";

    }

我的“else”每次都被执行,而不是if。为了再次检查,我将查询打印到“string sample”,这时我看到返回的值是SQL.Data.Command,代码中有两个大问题:

  • 不要连接字符串以生成sql命令文本
  • 对select查询使用ExecuteOnQuery是错误的。你需要 或执行官
  • 让我们看看如何修复代码

    string input_data = string.Empty;
    using (connection = new SqlConnection(connection_string))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.Text;
    
        cmd.CommandText = "SELECT * FROM name_table WHERE file_name LIKE @name";
        cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = "%" + filename + "%";
        cmd.Connection = connection;
        connection.Open();
    
        // Try to execute the command and read back the results.
        SqlDataReader reader = cmd.ExecuteReader();
    
        // If there is no record or the field to check for emptyness is empty
        if(!reader.Read() || string.IsNullOrEmpty(reader.GetString("SampleField"))
             input_data = AcceptFile(coda);
        else
             testing.Text = "File exists, please try another file.";
     }
    
     private string AcceptFile(string coda)
     {
          coda_file_upload.SaveAs(Server.MapPath("~/") + coda);
          string readText = System.IO.File.ReadAllText(Server.MapPath("~/") + coda);
          parse_CODA(readText, coda);
          testing.Text = "Success";
          return readText;
     }
    
    如果您只想知道与字段名匹配的行是否存在,则不需要检索任何记录,但可以使用耦合的从单行中获取单个值

    cmd.CommandText = @"IF EXISTS(SELECT 1 FROM name_table 
                                  WHERE file_name LIKE @name) 
                                  SELECT 1 ELSE SELECT 0";
    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = "%" + filename + "%";
    int result = Convert.ToInt32(cmd.ExecuteScalar());
    if(result == 0)
        .... no record found....
    else
        .... record exists...
    

    由于所述错误的一部分,您的问题是由于您不能使用对SqlCommand的引用并应用ToString以希望获得有意义的内容。该类不能使用ToString执行命令并返回返回的数据集中存在的任何字段。该类只需返回其自身的完整限定名称。

    首先:不要使用
    Select*
    而只需检查,请使用
    Select 1

    第二:你说:-

    我的返回类型是SQL.Data.Command,而不是实际的字符串本身

    下一行是原因:-

    string sample = Convert.ToString(cmd);
    
    固定代码:-

    if (coda_file_upload.HasFile)
        {
            coda = Path.GetFileName(filePath);  //gets the file name
            using (connection = new SqlConnection(connection_string))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;
    
                cmd.CommandText = "SELECT 1 FROM name_table WHERE file_name LIKE '%"+coda+"%' ";
    
                cmd.Connection = connection;
                connection.Open();
                string result = Convert.ToString(cmd.ExecuteScalar());
                connection.Close();
    
                if (result != "1")
                {
                    coda_file_upload.SaveAs(Server.MapPath("~/") + coda);
                    input_data = System.IO.File.ReadAllText(Server.MapPath("~/") + coda);
                    parse_CODA(input_data, coda);
    
                    testing.Text = "Success";
                }
    
                else /* Result == 1 */
                    testing.Text = "File exists, please try another file.";
    
            }
    

    听起来您希望
    SqlDataReader
    读取查询结果。或者,只需计算从
    cmd.ExecuteNonQuery()返回的行数@Steve Yeah,对不起,应该明确声明使用
    ExecuteScalar
    ,计数是我匆忙编辑的一个事后想法。谢谢。嗨,史蒂夫,谢谢。cmd.ExecuteNonQuery()返回一个int,是吗?因为VisualStudio在“SqlDataReader reader=cmd.ExecuteNonQuery()”行上弹出一个错误,还有什么是“SampleField”?因为这也会弹出一个错误。无法从字符串转换为整数。对不起。这是一个复制粘贴错误。如回答权开头所述,它是ExecuteReader。谢谢什么是samplefield?因为这一行仍然显示一个错误:if(!reader.Read()| | string.IsNullOrEmpty(reader.GetString(“SampleField”))我不知道您想从命令中检查或检索哪个字段。如果您只需要测试行的存在性,那么可以编写更好的查询。让我更新答案。我有两列,一列带有文件名,另一列带有唯一键。我只想检查带有文件名的列。这样,当用户上载时g、 如果已存在同名的现有文件,则该文件将不允许。您将永远不会得到任何行或行数作为ExecuteOnQuery的结果。此外,“1”是字符而不是字符串。谢谢,我的意思是使用ExecuteScalar,答案是编辑的