Tag: sqlparameter

将null作为SQLParameter DateTime值传递

我有以下查询: INSERT INTO CWS_FORWARDING_PROFILE (TNR_COMPANY_PROFILE,BOL_FORWARD_MAIL,BOL_FORWARD_SMS,BOL_FORWARD_MESSAGES ,DT_MO_FROM1,DT_MO_FROM2,DT_MO_FROM3,DT_MO_TO1,DT_MO_TO2,DT_MO_TO3 ,DT_TU_FROM1,DT_TU_FROM2,DT_TU_FROM3,DT_TU_TO1,DT_TU_TO2,DT_TU_TO3 ,DT_WE_FROM1,DT_WE_FROM2,DT_WE_FROM3,DT_WE_TO1,DT_WE_TO2,DT_WE_TO3 ,DT_TH_FROM1,DT_TH_FROM2,DT_TH_FROM3,DT_TH_TO1,DT_TH_TO2,DT_TH_TO3 ,DT_FR_FROM1,DT_FR_FROM2,DT_FR_FROM3,DT_FR_TO1,DT_FR_TO2,DT_FR_TO3 ,DT_SA_FROM1,DT_SA_FROM2,DT_SA_FROM3,DT_SA_TO1,DT_SA_TO2,DT_SA_TO3 ,DT_SU_FROM1,DT_SU_FROM2,DT_SU_FROM3,DT_SU_TO1,DT_SU_TO2,DT_SU_TO3) VALUES(@tnrProfile, @forwardMail, @forwardSms, @forwardMessages, @MoFrom1, @MoFrom2, @MoFrom3, @MoTo1, @MoTo2, @MoTo3, @TuFrom1, @TuFrom2, @TuFrom3, @TuTo1, @TuTo2, @TuTo3, @WeFrom1, @WeFrom2, @WeFrom3, @WeTo1, @WeTo2, @WeTo3, @ThFrom1, @ThFrom2, @ThFrom3, @ThTo1, @ThTo2, @ThTo3, @FrFrom1, @FrFrom2, @FrFrom3, @FrTo1, @FrTo2, @FrTo3, @SaFrom1, @SaFrom2, @SaFrom3, @SaTo1, @SaTo2, @SaTo3, @SuFrom1, @SuFrom2, @SuFrom3, […]

如何防御性地编码以随机引用“表0”和空值?

我正在检索适量的数据并对其进行处理 – 没有什么独特之处。 一开始很奇怪的是,有了一些数据集,它运行良好,而且与其他人一起,我得到了以下错误信息: 这个错误的消息似乎是完全的混合(但无论如何都是误导性的),因为失败的集合没有比成功的集合更多的数据,因此不应该再运行“坏”数据比好。 或许,在这之后出现的另一个错误信息是: 注意:我得到这些冗长的错误对话框,而不是更简洁的东西,因为您可以在下面的代码的catch块中看到调试代码。 所以很明显它并不是真正的“太多数据”问题,正如最初的错误消息所示。 这也不是“缺失数据”问题,因为如果我查询2014年12月到2015年12月的数据(即将到来的月份没有数据),它运行正常 – 它只返回2015年12月的全部0; 所以它必须是“坏(不仅仅是缺失)数据”问题。 如何确定坏数据是什么,防御性地阻止它破坏应用程序的运行? 涉及上述错误消息的第601行包含以下代码: private void ReadData(string _unit, string monthBegin, string monthEnd, string beginYear, string endYear) { try { String dateBegin = UsageRptConstsAndUtils.GetYYYYMMDD(monthBegin, beginYear, true); String dateEnd = UsageRptConstsAndUtils.GetYYYYMMDD(monthEnd, endYear, false); DateTime dtBegin = UsageRptConstsAndUtils.DatifyYYYYMMDD(dateBegin); DateTime dtEnd = UsageRptConstsAndUtils.DatifyYYYYMMDD(dateEnd); DataTable dtUsage = SqlDBHelper.ExecuteDataSet(“sp_ViewProductUsage_MappingRS”, CommandType.StoredProcedure, new […]

正确的SqlParameter语法

我正在尝试转换: command.Parameters.Add (new SqliteParameter (DbType.Int32) { Value = id }); 到正常的SqlParameter: command.Parameters.Add(new SqlParameter(DbType.Int32) { Value = id }); 我已经成功转换了除此之外的每一行,我收到这些错误: Error 3 Argument 1: cannot convert from ‘System.Data.DbType’ to ‘object[]’ Error 2 The best overloaded method match for ‘System.Data.SqlClient.SqlParameter.SqlParameter(object[])’ has some invalid arguments 全function代码: public User GetUser(int id) { var u = new User(); lock (locker) […]

有没有办法确定存储过程中的参数是否在代码中具有默认值(因此不是必需的) – .Net?

我已经从这样发送的存储过程中拉出参数: foreach (SqlParameter param in cmd.Parameters) { if ((param.Direction == ParameterDirection.Input) || (param.Direction == ParameterDirection.InputOutput)) { jsonReturn += “{\”paramName\”:\”” + param.ParameterName + “\”, \”paramType\”:\”” + param.SqlDbType.ToString() + “\”},”; } } 我查看了SqlParameter对象,无法找到一种方法来查看它是否可以告诉我参数是否具有默认值…(虽然我的调试器表现得很奇怪,所以谁知道)。 我正在做的是为用户构建一种Stored Proc帮助器。我现在告诉他们所有属于他们选择的存储过程的参数……我真的很想知道它们是否是必需的。

SqlDbType.Structured是什么意思?

从msdn 网站我得到以下内容: 一种特殊数据类型,用于指定表值参数中包含的结构化数据。 似乎我的代码使用它而没有它(使用存储过程将表推送到DB)。 有人可以解释它做了什么 – 我从定义中不理解它。

sqlparameter性能不佳

我有一个Web服务,所以处理程序一直被多次调用。 在里面我创建了SqlConnection和SqlCommand。 我必须执行大约7个不同的命令。 不同的命令需要各种参数,所以我只需添加一次: command.Parameters.Add(new SqlParameter(“@UserID”, userID)); command.Parameters.Add(new SqlParameter(“@AppID”, appID)); command.Parameters.Add(new SqlParameter(“@SID”, SIDInt)); command.Parameters.Add(new SqlParameter(“@Day”, timestamp.Date)); command.Parameters.Add(new SqlParameter(“@TS”, timestamp)); 然后在执行期间我只需更改CommandText prorerty,然后调用ExecuteNonQuery(); 或ExecuteScalar(); 我面临性能问题。 例如,小调试和分析显示该命令 command.CommandText = “SELECT LastShowTS FROM LogForAllTime WHERE UserID = @UserID”; 平均需要大约50毫秒。 如果我将其更改为: command.CommandText = “SELECT LastShowTS FROM LogForAllTime WHERE UserID = ‘” + userID.Replace(“\'”, “”) + “‘”; 然后它只需要1ms的平均值! 我只是无法弄清楚在哪里调查问题。

使用sql参数转义SQL LIKE语句中的特殊字符

我有一个包含产品的表。 我需要查询查找所有匹配结果到用户输入值。 我正在使用SqlParameter来插入输入。 SqlCommand findProcutsByPattern = new SqlCommand( “SELECT *” + ” FROM [Products]” + ” WHERE ProductName LIKE @pattern”, connection); findProcutsByPattern.Parameters.AddWithValue(“@pattern”, ‘%’ + pattern + ‘%’); 当用户输入字符串包含’_’或’%’时,问题就出现了,因为它们被解释为特殊字符。 另一方面,考虑到这一点: 命令对象使用参数将值传递给SQL语句或存储过程,从而提供类型检查和validation。 与命令文本不同,参数输入被视为文字值,而不是可执行代码。 我不应该有这样的问题。 我是否需要替换/转义输入字符串中的所有’_’和’%’,或者是否有更优雅的解决方案。 我希望输入被视为文字。 我在表中有一些记录,其中包括名称中的特殊字符(N_EW,N \ EW,N%EW,N“EW,N’EW)。指定\ , ”和‘作为输入工作正常(考虑它们)作为文字)。

如何在C#中创建NVarchar(max)Sql参数?

我有以下代码使用存储过程拉回DataTable并输入字符串参数@JobNumbers,它是动态创建的作业编号字符串(因此长度未知): using (SqlConnection connection = new SqlConnection(con)) { SqlCommand cmd = new SqlCommand(“dbo.Mystoredprocedure”, connection); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(“@JobNumbers”, SqlDbType.VarChar, 4000); cmd.Parameters[“@JobNumbers”].Value = JobNumber; SqlDataAdapter da = new SqlDataAdapter(cmd); connection.Open(); da.Fill(JobDetails); } 正如您所看到的,我当前将JobNumber参数设置为4000的长度,这应该足以承担大约500个作业号并且应该足够了。 但是,有可能在奇怪的场合需要更多。 所以,我想知道,有没有办法将参数设置为nvarchar(max)的等效sql参数类型? 我已经看过各种类似的问题( 将参数传递给SQLCommand的最佳方法是什么? )但没有具体说明你是否可以(或不能)这样做。 其次,如果我将存储过程中的@JobNumber参数设置为nvarchar(max),甚至需要这样做,因此我可能根本不需要在C#中设置长度? 如果我这样做,这将有潜在的性能问题,如此问题中所建议的在添加SqlCommand参数时何时应该使用“SqlDbType”和“size”? ?

为什么SqlParameter名称/值构造函数将0视为null?

我在一段代码中发现了一个奇怪的问题,即即使其参数与数据源中的记录匹配,adhoc SQL查询也没有产生预期的输出。 我决定将以下测试表达式输入到即时窗口中: new SqlParameter(“Test”, 0).Value 这给了null的结果,让我挠头。 似乎SqlParameter构造函数将零视为空值。 以下代码生成正确的结果: SqlParameter testParam = new SqlParameter(); testParam.ParameterName = “Test”; testParam.Value = 0; // subsequent inspection shows that the Value property is still 0 谁能解释这种行为? 这是故意的吗? 如果是这样,它可能相当危险……

SqlParameter不允许表名 – 没有sql注入攻击的其他选项?

我收到一个运行时错误,说”Must declare the table variable “@parmTableName” 。这意味着不允许在sql语句中将表名作为sql参数。 有没有比允许sql注入攻击更好的选择或建议? 我不想为sql语句” DELETE FROM ” + tableName + ” “做这个C#脚本; using(var dbCommand = dbConnection.CreateCommand()) { sqlAsk = “”; sqlAsk += ” DELETE FROM @parmTableName “; sqlAsk += ” WHERE ImportedFlag = ‘F’ “; dbCommand.Parameters.Clear(); dbCommand.Parameters.AddWithValue(“@parmTableName”, tableName); dbConnection.Open(); rowAffected = dbCommand.ExecuteNonQuery(); }