如何在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

谢谢:)

如何在SQL中插入包含c#中触发的过程引号的变量语句

从头开始!您的过程根据您提供的参数(@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();
    }
}