如何在SQL中插入包含c#中触发的过程引号的变量语句
本文关键字:过程 语句 变量 SQL 插入 包含 | 更新日期: 2023-09-27 18:01:35
我需要帮助,我有一个问题,而在SQL中插入语句。我从ASP调用SQL语句。. NET程序中,一些变量包含引号,所以当插入被触发时,我有一个异常,如:
异常详细信息:System.Data.SqlClient.SqlException: 'xxxxx'附近语法不正确。字符串" .
后的未闭引号我不希望变量的内容被改变…
你知道怎么处理这个吗?
c#部分:
SqlCommand cmdInsertAssessment = new SqlCommand("xxxxxxx", sqlCnx);
cmdInsertAssessment.CommandType = CommandType.StoredProcedure;
cmdInsertAssessment.Parameters.AddWithValue("@templateID", templateID);
cmdInsertAssessment.Parameters.AddWithValue("@companyID", companyID);
cmdInsertAssessment.Parameters.AddWithValue("@userID",userID);
cmdInsertAssessment.Parameters.AddWithValue("@opn",opn);
cmdInsertAssessment.Parameters.AddWithValue("@mn",Mm);
cmdInsertAssessment.Parameters.AddWithValue("@max",max);
cmdInsertAssessment.Parameters.AddWithValue("@remarque",remarque);
cmdInsertAssessment.Parameters.AddWithValue("@templateTheme",templateTheme);
cmdInsertAssessment.Parameters.AddWithValue("@name", sName);
cmdInsertAssessment.Parameters.AddWithValue("@finished", iFinished);
cmdInsertAssessment.Parameters.AddWithValue("@datenow", dtNow);
try
{
cmdInsertAssessment.ExecuteNonQuery();
}
catch (Exception e)
{
}
SQL部分:
CREATE PROCEDURE ["xxxxxxx"] @templateID int,
@companyID int,
@userID int,
@opn nvarchar(255),
@mn nvarchar(255),
@max int,
@remarque nvarchar(255),
@templateTheme nvarchar(255),
@name nvarchar(255),
@finished int,
@datenow datetime
AS
BEGIN
DECLARE
@points AS FLOAT
SET @points=0
IF(@mn='M')
BEGIN
IF(@opn='O')
BEGIN
SET @points=10
END
IF(@opn='P')
BEGIN
SET @points=2
END
END
IF(@mn!='M')
BEGIN
IF(@opn='O')
BEGIN
SET @points=2
END
if(@opn='P')
BEGIN
SET @points=1
END
END
IF(@remarque=NULL)
BEGIN
SET @remarque='nothing'
END
MERGE INTO [dbo].[Assessment] as target
USING (SELECT @templateID,@companyID,@userID,@opn,@points,@max,@remarque,@templateTheme,@datenow,@name,@finished)
As source (_templateID,_companyID,_userID,_opn,_points,_max,_remarque,_templateTheme,_datenow,_name,_finished)
ON target.TemplateID=source._templateID
AND target.TemplateTheme=source._templateTheme
AND target.NameAssessment=source._name
WHEN MATCHED THEN
UPDATE SET Points = source._points, Remarque = source._remarque, FillDate= source._datenow, Finished = source._finished, OPN = source._opn
WHEN NOT MATCHED THEN
INSERT (TemplateID, CompanyID, UserID, OPN, Points, Max, Remarque, TemplateTheme, FillDate, NameAssessment,Finished)
VALUES (source._templateID,source._companyID,source._userID,source._opn,source._points,source._max,source._remarque,source._templateTheme,source._datenow,source._name,source._finished);
END
GO
谢谢:)
从头开始!您的过程根据您提供的参数(@mn, @opn)计算一些点,然后插入或更新表Assessment。首先要说的是,这不是Merge的工作。Merge的目的是对两个表进行操作,对一行和一个表使用Merge是小题大做。你真的应该用
IF EXISTS( SELECT ID FROM ASSESSMENT WHERE... )
,然后写一个经典插入和一个经典更新。您的过程将更容易理解,更容易维护,并且可能运行得更快。
如果你还在读,我就继续读。积分的计算,不使用数据库中的任何业务逻辑,在c#中会更容易实现。无论把它放在哪里,都可以使用三元运算符来缩短这些非此即彼的选择。下面的代码替换了过程中的20行。
var points = (mn == 'm')?(opn == 'O'?10:2):(opn == 'O'?2:1);
赋值开始IF(@remarque = null)可以用空合并操作符ISNULL()在sql中完成,??在c#中,
如果你还在阅读,点击QueryFirst。您将获得SQL和c#之间的v.c clean分离,所有参数创建将为您完成。
因为您说要使用存储过程
using (SqlConnection cnn = new SqlConnection(/*Connection String*/))
{
using (SqlCommand cmd = new SqlCommand("MyStoredProcedure", cnn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@param1", "Value 1");
cmd.Parameters.AddWithValue("@param2", "xxxxxx");
cnn.Open();
}
}