我要做的是创建一些带参数的任意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#类方法中使用了许多可选的输入参数.由于可选语法在未使用参数时会创建值"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) 使用SqlParameters是一种推荐的方法来防止数据库查询中的SQL注入.在哪里可以找到内部消毒这些参数的代码/功能?我想在我的自定义实现中重用此功能.我试图使用Reflector找到它,但没有成功.
当我将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) 我有相同参数(服务器名称和日期)的存储过程.我想编写一个存储过程并在该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".
我有一个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的平均值!
我只是无法弄清楚在哪里调查问题.
如何将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)
我更改了这样的代码它给出了错误,就像我的评论检查其他部分
我有以下查询:
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) 我试图模拟数据库操作.我在嘲笑方面有问题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) sqlparameter ×10
c# ×8
sql-server ×3
sqlcommand ×3
ado.net ×2
sql ×2
.net ×1
datetime ×1
integer ×1
moq ×1
null ×1
parameters ×1
sqldbtype ×1
types ×1
unit-testing ×1