我需要帮助,在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
谢谢:)
答案 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();
}
}