在Sql server中存储过程,进行参数查询是,传入参数后,打印出sql语句,参数是以问号显示,

CelinaLQ 2017-09-08 01:42:17
如题 ,
存储过程的使用,当前台传入参数后,我在调试存储过程时候,打印sql语句,发现传入参数是???
问号,求各路大神解答
...全文
1228 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2017-09-13
  • 打赏
  • 举报
回复
怎么会出错,首先认准了位置,如下面所示 <?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8"/> 我上次回复是手工打得,可能有错,你复制上面写的代码,试一试
CelinaLQ 2017-09-12
  • 打赏
  • 举报
回复
引用 36 楼 qq_34745652 的回复:
[quote=引用 35 楼 From_TaiWan 的回复:] [quote=引用 30 楼 qq_34745652 的回复:] [quote=引用 25 楼 From_TaiWan 的回复:] 首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 PolicyDataBank http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> 这样对吗?[/quote]我感觉你的问题在于C#,不在于sql端。 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 这个,添加了没有[/quote] 在sysyem.web 节点下添加吗? 我在本地测试是没有问题的,但是通过vpn远程 就有问题[/quote] 直接增加在system.web节点下吗? 有报错,还是说需要别的节点?
CelinaLQ 2017-09-12
  • 打赏
  • 举报
回复
引用 35 楼 From_TaiWan 的回复:
[quote=引用 30 楼 qq_34745652 的回复:] [quote=引用 25 楼 From_TaiWan 的回复:] 首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 PolicyDataBank http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> 这样对吗?[/quote]我感觉你的问题在于C#,不在于sql端。 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 这个,添加了没有[/quote] 在sysyem.web 节点下添加吗? 我在本地测试是没有问题的,但是通过vpn远程 就有问题
CelinaLQ 2017-09-12
  • 打赏
  • 举报
回复
引用 37 楼 qq_34745652 的回复:
[quote=引用 36 楼 qq_34745652 的回复:] [quote=引用 35 楼 From_TaiWan 的回复:] [quote=引用 30 楼 qq_34745652 的回复:] [quote=引用 25 楼 From_TaiWan 的回复:] 首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 PolicyDataBank http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> 这样对吗?[/quote]我感觉你的问题在于C#,不在于sql端。 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 这个,添加了没有[/quote] 在sysyem.web 节点下添加吗? 我在本地测试是没有问题的,但是通过vpn远程 就有问题[/quote] 直接增加在system.web节点下吗? 有报错,还是说需要别的节点?[/quote] C# DataSet ds = new DataSet(); SqlConnection sqlconn = new SqlConnection(); sqlconn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ToString(); SqlCommand ProcedureCommand = new SqlCommand(ProcedureName, sqlconn); ProcedureCommand.CommandType = CommandType.StoredProcedure;//采用存储过程 ProcedureCommand.Parameters.Add("@projecttimestart", SqlDbType.NVarChar, 50);//招标时间(开始) ProcedureCommand.Parameters.Add("@projecttimeend", SqlDbType.NVarChar, 50);//招标时间(结束) ProcedureCommand.Parameters.Add("@sapproductid", SqlDbType.NVarChar, 50);//物料号 ProcedureCommand.Parameters.Add("@productname", SqlDbType.NVarChar, 50);//物料名称 #region 设置参数 for (int i = 0; i < ParametersValue.Count(); i++) { string getvalue = ParametersValue[i].ToString(); if (i == 0) { if (getvalue == "") { ProcedureCommand.Parameters["@projecttimestart"].Value = null; } else { ProcedureCommand.Parameters["@projecttimestart"].Value = getvalue; } } if (i == 1) { if (getvalue == "") { ProcedureCommand.Parameters["@projecttimeend"].Value = null; } else { ProcedureCommand.Parameters["@projecttimeend"].Value = getvalue; } } if (i == 2) { if (getvalue == "") { ProcedureCommand.Parameters["@sapproductid"].Value = null; } else { ProcedureCommand.Parameters["@sapproductid"].Value = getvalue ; } } if (i == 3) { if (getvalue == "") { ProcedureCommand.Parameters["@productname"].Value = null; } else { ProcedureCommand.Parameters["@productname"].Value = getvalue; } } } #endregion ProcedureCommand.Connection.Open(); SqlDataAdapter adapter = new SqlDataAdapter(ProcedureCommand); adapter.Fill(ds); return ds; 第四个参数 我设置断点时候 ,发现已经赋值了,应该不是C#层面的问问题
秋的红果实 2017-09-11
  • 打赏
  • 举报
回复
引用 30 楼 qq_34745652 的回复:
[quote=引用 25 楼 From_TaiWan 的回复:] 首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 PolicyDataBank http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> 这样对吗?[/quote]我感觉你的问题在于C#,不在于sql端。 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 这个,添加了没有
CelinaLQ 2017-09-11
  • 打赏
  • 举报
回复
引用 33 楼 qq_34745652 的回复:
[quote=引用 31 楼 qq_34745652 的回复:] [quote=引用 24 楼 yenange 的回复:] 转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的[/quote] 这个代码运行有问题,运行不了呢
引用 32 楼 yenange 的回复:
[quote=引用 31 楼 qq_34745652 的回复:] [quote=引用 24 楼 yenange 的回复:] 转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的[/quote] 不是解决你的乱码问题,是说你原来的存储过程有安全问题[/quote] 打印出的sql 语句 SELECT o.ProjectTime ,o.SapProductID ,ProductName,sum(cast(o.ApplyAmount as int)) as ApplyAmount ,sum(cast(o.Amount as int)) as Amount,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount ,sum(cast(sap.MENGE as float)) as MENGE FROM dbo.WFT_DATAFROM_SRMTOEIP AS O left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 AND O.productname like '%??%' group by o.ProjectTime ,o.SapProductID,ProductName 明白您的意思,这个乱码这个怎么解决? 通过参数化查询改造这个,我改造了一下,运行没有能通过[/quote] -- ============================================= -- Author: -- Create date: 2017-08-08 -- Description: -- ============================================= ALTER PROCEDURE SRMTOEIP_Test @projecttimestart NVARCHAR(50) = NULL , @projecttimeend NVARCHAR(50) = NULL , @sapproductid NVARCHAR(50) = NULL , @productname NVARCHAR(50) = NULL AS BEGIN DECLARE @SQL NVARCHAR(MAX); SET @SQL =' SELECT o.ProjectTime ,o.SapProductID ,ProductName ,sum(cast(o.ApplyAmount as int)) as ApplyAmount ,sum(cast(o.Amount as int)) as Amount ,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount ,sum(cast(sap.MENGE as float)) as MENGE FROM dbo.WFT_DATAFROM_SRMTOEIP AS O left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 '; IF ( @projecttimestart IS NOT NULL AND @projecttimeend IS NOT NULL ) BEGIN SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23) SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23) SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend' END; IF (@sapproductid IS NOT NULL) BEGIN SET @sapproductid = CONVERT(NVARCHAR, @sapproductid) SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid' END; IF (@productname IS NOT NULL) BEGIN SET @productname = @productname SET @SQL = @SQL + ' AND O.productname like ''%'+@productname+'%'''; END; SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName '; PRINT @SQL EXEC sp_executesql @SQL ,N'@projecttimestart NVARCHAR(50), @projecttimeend NVARCHAR(50), @sapproductid NVARCHAR(50), @productname NVARCHAR(50)' ,@projecttimestart ,@projecttimeend ,@sapproductid ,@productname END; 这样拼接可以吗?
CelinaLQ 2017-09-11
  • 打赏
  • 举报
回复
引用 31 楼 qq_34745652 的回复:
[quote=引用 24 楼 yenange 的回复:] 转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的[/quote] 这个代码运行有问题,运行不了呢
引用 32 楼 yenange 的回复:
[quote=引用 31 楼 qq_34745652 的回复:] [quote=引用 24 楼 yenange 的回复:] 转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的[/quote] 不是解决你的乱码问题,是说你原来的存储过程有安全问题[/quote] 打印出的sql 语句 SELECT o.ProjectTime ,o.SapProductID ,ProductName,sum(cast(o.ApplyAmount as int)) as ApplyAmount ,sum(cast(o.Amount as int)) as Amount,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount ,sum(cast(sap.MENGE as float)) as MENGE FROM dbo.WFT_DATAFROM_SRMTOEIP AS O left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 AND O.productname like '%??%' group by o.ProjectTime ,o.SapProductID,ProductName 明白您的意思,这个乱码这个怎么解决? 通过参数化查询改造这个,我改造了一下,运行没有能通过
吉普赛的歌 2017-09-11
  • 打赏
  • 举报
回复
引用 31 楼 qq_34745652 的回复:
[quote=引用 24 楼 yenange 的回复:] 转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的[/quote] 不是解决你的乱码问题,是说你原来的存储过程有安全问题
CelinaLQ 2017-09-11
  • 打赏
  • 举报
回复
引用 24 楼 yenange 的回复:
转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
新建查询时候加N是没问题,关键是我从C#层面传值过来,读取不出数据的
CelinaLQ 2017-09-11
  • 打赏
  • 举报
回复
引用 25 楼 From_TaiWan 的回复:
首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 PolicyDataBank http://go.microsoft.com/fwlink/?LinkId=301879 --> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections> 这样对吗?
CelinaLQ 2017-09-11
  • 打赏
  • 举报
回复
引用 23 楼 hanjun0612 的回复:
[quote=引用 21 楼 qq_34745652 的回复:] 有问题的是汉字,模糊查询时候数字字母也没事
有汉字的话需要url转码一下。后台在解码。 encodeURI 和 decodeURI[/quote] 具体怎么弄呢?
吉普赛的歌 2017-09-09
  • 打赏
  • 举报
回复
引用 26 楼 From_TaiWan 的回复:
@ #23,又欣赏到你漂亮的sql代码了
#23 是正月怒神, 他的代码很漂亮
秋的红果实 2017-09-09
  • 打赏
  • 举报
回复
@ #23,又欣赏到你漂亮的sql代码了
秋的红果实 2017-09-09
  • 打赏
  • 举报
回复
首先检查下根目录的web.config文件,这个没被动过吧 开头这句<?xml version="1.0" encoding="utf-8"?>,保证utf-8 在system.web节下,添加 <globalization fileEncoding="utf-8" requestEncoding=“utf-8” responseEncoding=“utf-8"/> 还有就是,你“打印”sql语句,是怎么打印的,会不会是因为打印而变成乱码的,而本身没问题。你可以测试sql运行是不是预期的结果
秋的红果实 2017-09-09
  • 打赏
  • 举报
回复
引用 27 楼 yenange 的回复:
[quote=引用 26 楼 From_TaiWan 的回复:] @ #23,又欣赏到你漂亮的sql代码了
#23 是正月怒神, 他的代码很漂亮[/quote]奥,说错了,是#24,yenange
吉普赛的歌 2017-09-08
  • 打赏
  • 举报
回复
转码、测试时要加 N'测试' 等人家都说了, 我就不再赘述, 还有一点要提醒的是: 在拼接sql时, 输入的值是不能拼接进来的, 这样会导致SQL 注入, 造成危险, 轻则查到、修改你所有的敏感数据, 重则删除你整个数据库的内容。拼SQL必须做到参数化
-- =============================================
-- Author:	
-- Create date: 2017-08-08
-- Description:	
-- =============================================
ALTER PROCEDURE [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP]
	@projecttimestart NVARCHAR(50) = NULL ,
	@projecttimeend NVARCHAR(50) = NULL ,
	@sapproductid NVARCHAR(50) = NULL ,
	@productname NVARCHAR(50) = NULL
AS
BEGIN
	DECLARE @SQL NVARCHAR(MAX);
	
	SET @SQL ='
SELECT o.ProjectTime 
,o.SapProductID 
,ProductName
,sum(cast(o.ApplyAmount as int)) as ApplyAmount 
,sum(cast(o.Amount as int)) as Amount
,SUM(cast(o.AwardingAmount as int) ) as AwardingAmount 
,sum(cast(sap.MENGE as float))  as  MENGE  
 FROM dbo.WFT_DATAFROM_SRMTOEIP AS O  
	left join WFT_DATAFROM_SAP sap on o.EBELN=sap.EBELN WHERE 1=1 
';
	IF (
	       @projecttimestart IS NOT NULL
	       AND @projecttimeend IS NOT NULL
	   )
	BEGIN
		SET @projecttimestart = CONVERT(NVARCHAR, @projecttimestart, 23)
		SET @projecttimeend = CONVERT(NVARCHAR, @projecttimeend, 23)
	    SET @SQL = @SQL + ' AND O.ProjectTime BETWEEN @projecttimestart AND @projecttimeend'''
	END;
	
	IF (@sapproductid IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.sapproductid=@sapproductid'
	END;
	IF (@productname IS NOT NULL)
	BEGIN
	    SET @SQL = @SQL + ' AND O.productname like  ''%@productname%'' ';
	END;
	SET @SQL = @SQL + ' group by o.ProjectTime, o.SapProductID, ProductName ';
	
	PRINT @SQL
	
	EXEC sp_executesql @SQL
		,N'@projecttimestart NVARCHAR(50),
			@projecttimeend NVARCHAR(50),
			@sapproductid NVARCHAR(50),
			@productname NVARCHAR(50)'
		,@projecttimestart
		,@projecttimeend
		,@sapproductid
		,@productname
END;

EXEC [dbo].[SP_QUERYDATAFROM_WFT_DATAFROM_SRMTOEIP] NULL,
     NULL,
     NULL,
     N'测试'
正怒月神 版主 2017-09-08
  • 打赏
  • 举报
回复
引用 21 楼 qq_34745652 的回复:
有问题的是汉字,模糊查询时候数字字母也没事
有汉字的话需要url转码一下。后台在解码。 encodeURI 和 decodeURI
还想懒够 2017-09-08
  • 打赏
  • 举报
回复
引用 12 楼 baidu_40156755 的回复:
怎么说,如果写死想查询数据,必须在前面加个N
是的,字符编码的问题导致的,引号前面加N即可,如Like N'%*****%'
CelinaLQ 2017-09-08
  • 打赏
  • 举报
回复
引用 20 楼 hanjun0612 的回复:
你看一下 var startTime = $("#projecttimestart").val(); var endTime = $("#projecttimeend").val(); 这两个传递到后台是什么值,如果事件带t字幕,自己处理一下
时间传到后台和存储过程时没有问题的额,, 有问题的是汉字,模糊查询时候数字字母也没事
正怒月神 版主 2017-09-08
  • 打赏
  • 举报
回复
你看一下 var startTime = $("#projecttimestart").val(); var endTime = $("#projecttimeend").val(); 这两个传递到后台是什么值,如果事件带t字幕,自己处理一下
加载更多回复(19)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧