C# 向SQL server查询返回有关搜索的字符串
我试图找出正在上载的文件是否已经存在于服务器中。对我来说,一种方法是检查是否存在相同的文件名。然而,代码中的某些内容似乎不正确。我已经使用SSMS运行了该查询,它可以工作,但是当我将其放入Visual Studio时,返回类型是SQL.Data.Command,而不是实际的字符串本身。有人能给我指一下正确的方向吗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
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,代码中有两个大问题:
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,答案是编辑的