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

时间:2016-08-09 14:20:50

标签: c# sql asp.net .net

我需要帮助,在SQL中插入语句时遇到问题。 我从我的ASP.NET程序调用一个SQL语句,一些变量包含引号所以当插入被触发时我有一个例外:

异常详细信息:System.Data.SqlClient.SqlException:&x; xxxxx&#39;附近的语法不正确。 字符串后面的未闭合引号&#39; <#39;。

我不希望更改变量的内容......

知道怎么处理这个吗?

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

谢谢:)

2 个答案:

答案 0 :(得分:0)

从一开始就把事情搞定!您的程序根据您提供的参数(@mn,@ opn)计算多个点,然后插入或更新表格评估。首先要说的是not a job for Merge。 Merge旨在对两个表进行操作,并将其用于行和表是使用大锤来破解螺母。你应该真的使用

IF EXISTS( SELECT ID FROM ASSESSMENT WHERE... )

然后编写经典插入和经典更新。您的程序将更容易理解,更易于维护,并且可能运行得更快。

如果你还在读书,我会坚持下去。计算点,在DB中不使用任何内容的业务逻辑,在C#中会更加快乐。无论你把它放在哪里,你都可以使用三元运算符来缩短这些或者选择。以下内容将替换您程序中的20行。

var points = (mn == 'm')?(opn == 'O'?10:2):(opn == 'O'?2:1);

可以使用sql中的空合并运算符ISNULL()来完成从IF开始的赋值(@remarque = null)。在C#。

如果您还在阅读,请抓住QueryFirst。您将在SQL和C#之间获得v.clean分离,并且将为您完成所有参数创建。

答案 1 :(得分:-1)

因为你说你想使用存储过程

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();
    }
}