标签: sqlparameter

是否可以使用SqlParameters获取SqlCommand的已解析文本?

我要做的是创建一些带参数的任意sql命令,设置参数的值和类型,然后返回解析的sql命令 - 包含参数.我不会直接对sql数据库运行此命令,因此不需要连接.因此,如果我运行下面的示例程序,我希望看到以下文本(或类似的东西):

WITH SomeTable (SomeColumn)
AS
(
    SELECT N':)'
    UNION ALL
    SELECT N'>:o'
    UNION ALL
    SELECT N'^_^'
)
SELECT SomeColumn FROM SomeTable
Run Code Online (Sandbox Code Playgroud)

示例程序是:

using System;
using System.Data;
using System.Data.SqlClient;

namespace DryEraseConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            const string COMMAND_TEXT = @"
WITH SomeTable (SomeColumn)
AS
(
    SELECT N':)'
    UNION ALL
    SELECT N'>:o'
    UNION ALL
    SELECT @Value
)
SELECT SomeColumn FROM SomeTable
";
            SqlCommand cmd = new SqlCommand(COMMAND_TEXT);
            cmd.CommandText = COMMAND_TEXT;
            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sqlcommand sqlparameter

15
推荐指数
1
解决办法
8129
查看次数

将NULL值分配给SqlParameter的最佳方法

我在C#类方法中使用了许多可选的输入参数.由于可选语法在未使用参数时会创建值"0",因此我在方法中调用的SQL插入命令将逐渐插入.但是,我需要命令在不使用参数时插入NULL值而不是0.在不使用大量"if"语句的情况下实现此目的的最佳方法是什么?

以下是我所指的代码.是否有某种语法/命令允许我在SqlParameter声明中指定NULL值?

public int batchInsert
(
    int id, 
    int outcome, 
    int input = 0, 
    int add = 0, 
    int update = 0,
    int delete = 0,
    int errors = 0, 
    int warnings = 0
)
{
    string sts;
    if (outcome == 0)
    {
        sts = "S";
    }
    else if (outcome == 1)
    {
        sts = "W";
    }
    else
    {
        sts = "E";
    }

    SqlConnection sqlConn = new SqlConnection(this.connString);
    SqlParameter runId = new SqlParameter("@runId", id);
    SqlParameter endTime = new SqlParameter("@endTime", DateTime.Now); …
Run Code Online (Sandbox Code Playgroud)

c# null sqlparameter

15
推荐指数
1
解决办法
4万
查看次数

SqlCommand如何清理参数?

使用SqlParameters是一种推荐的方法来防止数据库查询中的SQL注入.在哪里可以找到内部消毒这些参数的代码/功能?我想在我的自定义实现中重用此功能.我试图使用Reflector找到它,但没有成功.

.net sqlparameter

10
推荐指数
1
解决办法
3694
查看次数

SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受DBNull对象

当我将SQL参数添加p到集合时,我得到一个InvalidCastException带有帖子标题的消息.

parentId 是数据库中的可空整数和可空整数.

为什么我会得到这个例外,我该如何解决?

我不使用存储过程,我已经读过类似的线程,但他们没有帮助我.

var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value;
cmd.Parameters.Add(p);  
Run Code Online (Sandbox Code Playgroud)

c# sql ado.net sqlparameter

10
推荐指数
1
解决办法
1万
查看次数

如何在存储过程中调用存储过程(带有2个参数)?

我有相同参数(服务器名称和日期)的存储过程.我想编写一个存储过程并在该SP中执行它们(称为SP_All).

CREATE PROCEDURE [dbo].[SP_All]
AS
BEGIN
exec sp_1   @myDate datetime, @ServerName sysname
exec sp_2   @myDate datetime, @ServerName sysname
exec sp_3   @myDate datetime, @ServerName sysname
exec sp_4   @myDate datetime, @ServerName sysname
END
Go 
Run Code Online (Sandbox Code Playgroud)

错误:必须声明标量变量"@myDate".

sql sql-server parameters stored-procedures sqlparameter

10
推荐指数
2
解决办法
5万
查看次数

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));
Run Code Online (Sandbox Code Playgroud)

然后在执行期间我只需更改CommandText prorerty,然后调用ExecuteNonQuery(); 或ExecuteScalar();

我面临性能问题.例如,小调试和分析显示该命令

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = @UserID";
Run Code Online (Sandbox Code Playgroud)

平均需要大约50毫秒.如果我将其更改为:

command.CommandText = "SELECT LastShowTS FROM LogForAllTime WHERE UserID = '" + userID.Replace("\'", "") + "'";
Run Code Online (Sandbox Code Playgroud)

然后它只需要1ms的平均值!

我只是无法弄清楚在哪里调查问题.

c# sql-server ado.net sqlcommand sqlparameter

9
推荐指数
1
解决办法
1万
查看次数

如何在整数数据类型变量中将sql参数作为空值传递?

如何将sql参数作为空值传递给整数数据类型变量?

        StockBO sBO = new StockBO();
        sBO.Mode = 2;
        if (ddcmpanyname.SelectedIndex != 0)
        {
            sBO.Client_id = Convert.ToInt16(ddcmpanyname.SelectedValue);
        }
        else
        {
            sBO.Client_id = Convert.ToInt16(DBNull.Value);//Object cannot be cast from DBNull to other types.
       sBO.Client_id =DBNull.Value;//Cannot implicitly convert type 

        }
        ds=_StockController.StockGet(sBO);
Run Code Online (Sandbox Code Playgroud)

我更改了这样的代码它给出了错误,就像我的评论检查其他部分

c# types integer sqlparameter

8
推荐指数
1
解决办法
5万
查看次数

将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, @SuTo1, @SuTo2, @SuTo3);
Run Code Online (Sandbox Code Playgroud)

我添加我的DateTime参数如下:

SqlParameter moFrom1Param = new SqlParameter("@MoFrom1", dTOForwarding.MoFrom1);
            moFrom1Param.IsNullable = true;
            moFrom1Param.Direction = ParameterDirection.Input;
            moFrom1Param.SqlDbType = SqlDbType.DateTime;
            cmd.Parameters.Add(moFrom1Param);
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,只给出某些参数的实际日期时间,其余的都为空.所以要明确的是,从星期一到星期三的所有参数都有一个日期时间值.周四休息,直到周日没有.所以那些传递为null.我收到这样的错误:

The parameterized query '(@tnrProfile …
Run Code Online (Sandbox Code Playgroud)

c# datetime sqlparameter

8
推荐指数
2
解决办法
3万
查看次数

SqlDbType.Structured是什么意思?

从msdn 网站我得到以下内容:

一种特殊数据类型,用于指定表值参数中包含的结构化数据.

似乎我的代码使用它而没有它(使用存储过程将表推送到DB).

有人可以解释它做了什么 - 我从定义中不理解它.

c# sqlcommand sqldbtype sqlparameter

8
推荐指数
1
解决办法
7412
查看次数

如何使用Moq模拟SqlParameterCollection

我试图模拟数据库操作.我在嘲笑方面有问题SqlParameterCollection.我试图创建virtual方法会返回DbParameterCollection,但那时候我失去了所有的功能,SqlParameterCollection给喜欢AddWithValue等是否有一种方法,我可以嘲笑SqlParameterCollection?单元测试DAL还有其他方法吗?我正在使用Moq.

代码是这样的:

在DAL:

protected virtual IDbConnection GetConnection(string connectionString)
{
    return new SqlConnection(connectionString);
}

protected virtual IDbCommand GetCommand(IDbConnection cn)
{
    return cn.CreateCommand();
}

protected virtual IDbTransaction GetTransaction(IDbConnection cn)
{
    return cn.BeginTransaction(IsolationLevel.Serializable);
}

Public Bool InsertInDatabase(DataTable dt)
{
   using (IDbConnection cn = GetConnection(cnstr))
      {
         cn.Open();

            using (IDbTransaction tran = GetTransaction(cn))
            {
                IDbCommand cmd = GetCommand(cn);
                cmd.Transaction = tran;
                cmd.Connection = cn;
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = "sp_InsertInDatabase";
                SqlParameterCollection cmdParams = …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq sqlparameter

7
推荐指数
1
解决办法
3966
查看次数