【问题标题】:stored procedure in sql used in c#c#中使用的sql中的存储过程
【发布时间】:2014-04-01 07:53:10
【问题描述】:

我在sql中使用了以下存储过程:

alter procedure [dbo].[usp_Member_Org_OnGoingJobs]
(
    @idUser varchar(50)

)
as
begin
declare @qry as varchar(max)
set @qry='select J.idJob,j.DateAdded,j.OpenedByWho,j.JobAddress ,j.final,j.idOrg,j.note
                              from Job J 
                              inner join Users U on
                              U.idOrg=J.idOrg
                              where U.IdUser='+ @idUser+ '
                              and ISNULL(j.Final,'')='' 
                              order by idJob'


  execute(@qry)
end
GO

这个存储过程在sql中成功形成。

但是,当我尝试通过 asp.net c# 使用它们时,它给了我错误:

Incorrect syntax near the keyword 'order'.

一切似乎都是正确的。

请告诉我哪里出错了??

编辑:

private void BindOnGoingJobs()
    {
        string sqlOnGoingJobs = "usp_Member_Org_OnGoingJobs";

        DataTable dtJobList = new DataTable();
        ArrayList paramList = new ArrayList();

        paramList.Add(new ParamData("@idUser", Convert.ToString(Session["idUser"])));
        dtJobList = obj.ExecuteProcedureAndGetDataTable(sqlOnGoingJobs, paramList);
        grdOnGoingJobs.DataSource = dtJobList;
        grdOnGoingJobs.DataBind();

        paramList.Clear();
    }

 public DataTable ExecuteProcedureAndGetDataTable(string procedureName, ArrayList Parameters)
        {
            DataTable dt = new DataTable();
            try
            {
                if (con.State != ConnectionState.Open)
                    con.Open();
                cmd.Connection = con;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = procedureName;
                cmd.Parameters.Clear();
                foreach (ParamData p in Parameters)
                {
                    cmd.Parameters.AddWithValue(p.pName, p.pValue);
                }
                da.SelectCommand = cmd;
                da.Fill(dt);
                con.Close();
                return dt;
            }
            catch (Exception ex)
            {
                con.Close();
                return dt;
            }
        }

【问题讨论】:

  • @Steve sir 我添加了调用此存储过程的函数...使用它们来绑定网格
  • 附带说明,您在存储过程中使用动态 sql 的任何特殊原因?动态 sql 看起来对你正在做的事情完全没有必要,实际上你很容易受到 sql 注入攻击。

标签: c# asp.net sql stored-procedures sql-server-2008-r2


【解决方案1】:

您需要在 ISNULL 检查周围加双引号

set @qry='select J.idJob,j.DateAdded,j.OpenedByWho,j.JobAddress ,j.final,j.idOrg,j.note
                          from Job J 
                          inner join Users U on
                          U.idOrg=J.idOrg
                          where U.IdUser='+ @idUser+ '
                          and ISNULL(j.Final,'''')='''' 
                          order by idJob'

【讨论】:

  • 你需要对idUser做同样的检查where U.IdUser='''+ @idUser+ '''
【解决方案2】:

您需要像这样放置两次引号来转义引号。

and ISNULL(j.Final,'''')=''''

查看这篇博文http://blog.sqlauthority.com/2008/02/17/sql-server-how-to-escape-single-quotes-fix-error-105-unclosed-quotation-mark-after-the-character-string/

【讨论】:

    【解决方案3】:

    只需按顺序添加表别名,我想应该可以解决问题

    按 J.idJob 排序

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多