Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLCommand在C#中进行SQL多行查询_C#_Sql Server - Fatal编程技术网

使用SQLCommand在C#中进行SQL多行查询

使用SQLCommand在C#中进行SQL多行查询,c#,sql-server,C#,Sql Server,我想使用C#从SQL Server中的不同表加载特定数据,但在关键字“as”附近出现了一个错误错误语法。“EP”附近的语法不正确。关键字“AND.”附近的语法不正确。代码运行良好,因为我放置了一个messageBox来显示查询、一个messageBox popsup和show full查询,但在此之后,我遇到了一个错误,正如我上面提到的那样 这是密码 private void FillGridView() { CS = ConfigurationManager.Conn

我想使用C#从SQL Server中的不同表加载特定数据,但在关键字“as”附近出现了一个错误
错误语法。“EP”附近的语法不正确。关键字“AND.”附近的语法不正确。
代码运行良好,因为我放置了一个messageBox来显示查询、一个messageBox popsup和show full查询,但在此之后,我遇到了一个错误,正如我上面提到的那样 这是密码

 private void FillGridView()
    {
        CS = ConfigurationManager.ConnectionStrings["HRMSConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(CS))
        { SqlCommand cmd = new SqlCommand(query, con);
                con.Open();
                SqlDataAdapter ad = new SqlDataAdapter(cmd);
                ad.Fill(dt);
                gvShowAllData.DataSource = dt;
        }
    }
这是一个问题

    string query = @"Select 'ACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact" +
",D.desig_id,D.desig_name" +
"from EMP_Master as e,EMP_Posting_Log as p,EMP_Designation AS D" +
"where e.emp_id=p.emp_id" +
"AND P.desg_id=D.desig_id" +
"and p.status='ACTIVE'" +
"AND E.emp_name LIKE '%" + tbSearchName.Text + "%'" +
"UNION" +
"Select 'INACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact" +
",NULL,NULL" +
"from EMP_Master as e" +
"WHERE E.emp_id IN (SELECT DISTINCT EP.emp_id FROM EMP_Posting_Log AS EP" +
"WHERE EP.status='INACTIVE')" +
"AND E.emp_name LIKE '%" + tbSearchName.Text + "%'" +
"UNION" +
"Select 'NOT POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact" +
",NULL,NULL" +
"from EMP_Master as e" +
"WHERE E.emp_id NOT IN (SELECT DISTINCT EP1.emp_id FROM EMP_Posting_Log AS EP1)" +
"AND E.emp_name LIKE '%" + tbSearchName.Text + "%'";

您的问题是因为字符串的串联。当字符串以
@
开头时,可以在多行上写入字符串,而无需使用
+

string query = @"
Select 'ACTIVE POSTING' as POSTING, e.emp_id, e.emp_name, 
        e.emp_fathername, e.emp_nic, e.emp_contact, D.desig_id, D.desig_name

//and so on continue with your query
";

还要查看
SqlCommand.Parameters
,以防止代码被sql注入。

您的问题是由于字符串的串联。当字符串以
@
开头时,可以在多行上写入字符串,而无需使用
+

string query = @"
Select 'ACTIVE POSTING' as POSTING, e.emp_id, e.emp_name, 
        e.emp_fathername, e.emp_nic, e.emp_contact, D.desig_id, D.desig_name

//and so on continue with your query
";

还要查看
SqlCommand.Parameters
以防止代码被sql注入。

字符串部分之间需要空格。您希望连接可以创建新行,但实际情况并非如此。如果需要新行或字符串之间的空格,则需要将其添加到字符串中

更重要的问题是,您的查询容易受到sql注入攻击。用户输入时应始终使用参数

string query = @"Select 'ACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,D.desig_id,D.desig_name
 from EMP_Master as e,EMP_Posting_Log as p,EMP_Designation AS D
 where e.emp_id=p.emp_id
 AND P.desg_id=D.desig_id
 and p.status='ACTIVE'
 AND E.emp_name LIKE @tbSearchName
 UNION
 Select 'INACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,NULL,NULL
 from EMP_Master as e
 WHERE E.emp_id IN (SELECT DISTINCT EP.emp_id FROM EMP_Posting_Log AS EP
 WHERE EP.status='INACTIVE')
 AND E.emp_name LIKE @tbSearchName
 UNION
 Select 'NOT POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,NULL,NULL
 from EMP_Master as e
 WHERE E.emp_id NOT IN (SELECT DISTINCT EP1.emp_id FROM EMP_Posting_Log AS EP1)
 AND E.emp_name LIKE @tbSearchName";
关于添加参数:

cmd.Parameters.Add(new SqlParameter("@tbSearchName", SqlDbType.VarChar) {Value = "%" + tbSearchName.Text + "%"});

在字符串部分之间需要空格。您希望连接可以创建新行,但实际情况并非如此。如果需要新行或字符串之间的空格,则需要将其添加到字符串中

更重要的问题是,您的查询容易受到sql注入攻击。用户输入时应始终使用参数

string query = @"Select 'ACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,D.desig_id,D.desig_name
 from EMP_Master as e,EMP_Posting_Log as p,EMP_Designation AS D
 where e.emp_id=p.emp_id
 AND P.desg_id=D.desig_id
 and p.status='ACTIVE'
 AND E.emp_name LIKE @tbSearchName
 UNION
 Select 'INACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,NULL,NULL
 from EMP_Master as e
 WHERE E.emp_id IN (SELECT DISTINCT EP.emp_id FROM EMP_Posting_Log AS EP
 WHERE EP.status='INACTIVE')
 AND E.emp_name LIKE @tbSearchName
 UNION
 Select 'NOT POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact,NULL,NULL
 from EMP_Master as e
 WHERE E.emp_id NOT IN (SELECT DISTINCT EP1.emp_id FROM EMP_Posting_Log AS EP1)
 AND E.emp_name LIKE @tbSearchName";
关于添加参数:

cmd.Parameters.Add(new SqlParameter("@tbSearchName", SqlDbType.VarChar) {Value = "%" + tbSearchName.Text + "%"});

虽然它在代码中出现在“行”中,但您只是在生成一行SQL,而您的空格是不正确的—您可以尝试以下操作

        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.AppendLine(@"Select 'ACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact");
        sb.AppendLine(@",D.desig_id,D.desig_name");
        sb.AppendLine(@"from EMP_Master as e,EMP_Posting_Log as p,EMP_Designation AS D");
        sb.AppendLine(@"where e.emp_id=p.emp_id");
        sb.AppendLine(@"AND P.desg_id=D.desig_id");
        sb.AppendLine(@"and p.status='ACTIVE'");
        sb.AppendLine("AND E.emp_name LIKE '%" + tbSearchName.Text.Replace(@"'",@"''") + "%'");  //escape single quote to avoid SQL injection attack

        //....and so on with the rest of your lines

        string query = sb.ToString();

        //then as before

虽然它在代码中出现在“行”中,但您只是在生成一行SQL,而您的空格是不正确的—您可以尝试以下操作

        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.AppendLine(@"Select 'ACTIVE POSTING' as POSTING,e.emp_id,e.emp_name,e.emp_fathername,e.emp_nic,e.emp_contact");
        sb.AppendLine(@",D.desig_id,D.desig_name");
        sb.AppendLine(@"from EMP_Master as e,EMP_Posting_Log as p,EMP_Designation AS D");
        sb.AppendLine(@"where e.emp_id=p.emp_id");
        sb.AppendLine(@"AND P.desg_id=D.desig_id");
        sb.AppendLine(@"and p.status='ACTIVE'");
        sb.AppendLine("AND E.emp_name LIKE '%" + tbSearchName.Text.Replace(@"'",@"''") + "%'");  //escape single quote to avoid SQL injection attack

        //....and so on with the rest of your lines

        string query = sb.ToString();

        //then as before


字符串中每行的末尾没有空格。它们将连接在一起,但不带空格。命令将一起运行。请尝试使用字符串生成器或字符串插值。您的代码易受SQL注入的影响。对所有用户输入值使用参数而不是字符串连接。字符串中每行末尾没有空格。它们将连接在一起,但不带空格。命令将一起运行。请尝试使用字符串生成器或字符串插值。您的代码易受SQL注入的影响。对所有用户输入值使用参数而不是字符串连接。@BenW-我的最爱之一:)@Igor谢谢你宝贵的回答,我已经添加了空格,但现在我得到的唯一错误是
关键字“as”附近的语法不正确。
@khaafi-那么你没有复制我上面的内容。复制整个语句并逐字使用。然后使用我提供的添加参数,并在创建SqlCommand实例后添加该参数。这应该可以解决您的问题。但是仍然得到相同的错误,我已经放置了
cmd.Parameters.Add(新的SqlParameter(“@tbSearchName”,SqlDbType.VarChar){Value=“%”+tbSearchName.Text+“%”})
after
SqlCommand cmd=newsqlcommand(查询,con)
@khaafi-您可以在SSMS中进行测试,方法是复制引号(
)之间的所有内容,并将其放入新的查询窗口,并在顶部添加
声明@tbSearchName varchar(2000)='%TEST VALUE HERE%'
并将您的值放在那里。然后查看是否运行。如果运行了,则说明您没有将上面的内容正确复制到您的代码中,或者在进行更改后没有重新编译代码。如果没有运行,则查看错误发生在哪一行,然后报告,我们可以看到问题所在。@BenW-我的一个f声明:)@Igor谢谢你宝贵的回答,我已经添加了空格,但现在我得到的唯一错误是
关键字“as”附近的语法不正确。
@khaafi-那么你没有复制我上面的内容。复制整个语句并逐字使用。然后使用我提供的添加参数,并在创建SqlCommand实例.T后添加该参数这应该可以解决您的问题。但是仍然得到相同的错误,我已经将
cmd.Parameters.Add(new-SqlParameter(@tbSearchName,SqlDbType.VarChar){Value=“%”+tbSearchName.Text+“%”});
放在
SqlCommand cmd=new-SqlCommand(query,con);
@khaafi-您可以通过在引号之间复制所有内容在SSMS中进行测试(
)并将其放入新的查询窗口,在顶部添加
DECLARE@tbSearchName varchar(2000)='%TEST VALUE HERE%'
并将您的值放入其中。然后看看它是否运行。如果运行了,那么您没有将上面的内容正确地复制到您的代码中,或者在进行更改后没有重新编译代码。如果它没有运行,那么请查看错误发生在哪一行,并向我们报告,我们可以查看问题所在。谢谢。。爱你:)我无法用同样的查询将图像从数据库提取到pictureBox,你愿意帮我吗?我已经从数据库中重新加载了所有其他控件数据,但无法加载包含上述内容的图像query@kh-如果您试图返回图像-您使用什么方法将图像数据输入pictureBox?当我插入图像时,我首先通过缓冲区将图像转换为内存流,并将图像存储为原始格式,为了将图像从数据库重新加载到picturebox,我从内存流转换图像,并将图像存储在byte[]数组中。首先,它很好地工作意味着图像重新加载到图片框,但当我使用上面的带有联合的SQL查询时,它抛出了一个错误。请帮帮我,一个男人。。爱你:)我无法用同样的查询将图像从数据库提取到pictureBox,你愿意帮我吗?我已从D重新加载所有其他控件数据