C# 用于在ASP.Net中更新或插入资产的SQL CE语句
我正在创建一个web表单以将信息插入数据库。我在将此设置为插入键入的信息时没有遇到任何问题,但如果数据库中已经存在条目,则在尝试重新格式化命令以更新信息时遇到了麻烦 当我尝试提交更改时,出现以下错误: 分析查询时出错。[令牌行编号=1,令牌行偏移量=7,令牌出错=资产] 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Data.SqlServerCe.SqlCeException:分析查询时出错。[令牌行编号=1,令牌行偏移量=7,令牌出错=资产] 源错误: 第39行:插入(资产编号、序列号、资产类型、型号、位置、修改日期、注释), 第40行:值(@0、@1、@2、@3、@4、@5、@6)”; 第41行:db.Execute(插入命令、资产编号、序列号、资产类型、模型、目录、当前时间、注释); 第42行:Response.Redirect(“~/AssetLookup”); 第43行:} 代码错误出现在第41行。我在下面的代码中唯一更改的是SQL语句,所以我确信这是错误的。这是我第一次尝试使用SQL;我做了一些挖掘,试图找出该语句的错误,但特别是我在使用…方面遇到了问题。我不是r我很确定应该去那里做什么,我觉得这可能就是问题所在C# 用于在ASP.Net中更新或插入资产的SQL CE语句,c#,sql,asp.net,razor,C#,Sql,Asp.net,Razor,我正在创建一个web表单以将信息插入数据库。我在将此设置为插入键入的信息时没有遇到任何问题,但如果数据库中已经存在条目,则在尝试重新格式化命令以更新信息时遇到了麻烦 当我尝试提交更改时,出现以下错误: 分析查询时出错。[令牌行编号=1,令牌行偏移量=7,令牌出错=资产] 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.Data.SqlServerCe.SqlCeException:分析查询时出错。[令牌行编号
var assetNumber = "";
var serialNumber = "";
var assetType = "";
var model = "";
var toCube = "";
var comments = "";
if(IsPost && Validation.IsValid()){
assetNumber = Request.Form["assetNumber"];
serialNumber = Request.Form["serialNumber"];
assetType = Request.Form["assetType"];
model = Request.Form["model"];
toCube = Request.Form["toCube"];
var currentTime = DateTime.Now;
comments = Request.Form["comments"];
var db = Database.Open("Assets");
var insertCommand =
@"MERGE Assets AS Target
USING (SELECT assetNumber, serialNumber FROM Assets) AS Source
ON (Target.assetNumber = Source.assetNumber AND Target.serialNumber = Source.serialNumber)
WHEN MATCHED THEN
UPDATE SET
AssetNumber=@0,
SerialNumber=@1,
AssetType=@2,
Model=@3,
Location=@4,
DateModified=@5,
Comments=@6
WHEN NOT MATCHED THEN
INSERT (AssetNumber, SerialNumber, AssetType, Model, Location, DateModified, Comments),
VALUES (@0, @1, @2, @3, @4, @5, @6)";
db.Execute(insertCommand, assetNumber, serialNumber, assetType, model, toCube, currentTime, comments);
Response.Redirect("~/AssetLookup");
}
正如我所说的,我确信我的SQL语句在某种程度上是混乱的,因为我“有点”理解它,但在使用方面特别困惑。所有表列和变量名都是根据代码/db的其余部分正确设置的。有人能给我一些关于这个命令应该使用的语法的建议吗
更新:
根据Steve的评论,我已经更新了问题,以反映这是SQL CE而不是标准版本。看起来您没有任何东西将目标与源绑定在一起。您正在使用on子句有效地将目标表与自身进行比较 也许可以试试这样:
var assetNumber = "";
var serialNumber = "";
var assetType = "";
var model = "";
var toCube = "";
var comments = "";
if(IsPost && Validation.IsValid()){
assetNumber = Request.Form["assetNumber"];
serialNumber = Request.Form["serialNumber"];
assetType = Request.Form["assetType"];
model = Request.Form["model"];
toCube = Request.Form["toCube"];
var currentTime = DateTime.Now;
comments = Request.Form["comments"];
var db = Database.Open("Assets");
var insertCommand =
@"MERGE Assets AS Target
USING (SELECT @0 as assetNumber, @1 as serialNumber) AS Source
ON (Target.assetNumber = Source.assetNumber AND Target.serialNumber = Source.serialNumber)
WHEN MATCHED THEN
UPDATE SET
AssetNumber=@0,
SerialNumber=@1,
AssetType=@2,
Model=@3,
Location=@4,
DateModified=@5,
Comments=@6
WHEN NOT MATCHED THEN
INSERT (AssetNumber, SerialNumber, AssetType, Model, Location, DateModified, Comments),
VALUES (@0, @1, @2, @3, @4, @5, @6)";
db.Execute(insertCommand, assetNumber, serialNumber, assetType, model, toCube, currentTime, comments);
Response.Redirect("~/AssetLookup");
}
我对这一点不是100%,因为我不太熟悉Razor或通过代码运行查询(我通常坚持使用存储过程),但听起来您想将传入的资产和序列号与表中的实际数据进行比较,而之前的数据则无法做到这一点。以一种非常基本的方式,我通过将一些C#if/else逻辑(因为SQL CE也不支持)与基本SQL语句相混合来实现这一点 此代码检查表单提交是否与资产和序列号匹配,如果找到匹配项,则更新。如果未返回任何记录,则将资产添加到数据库:
var db = Database.Open("Assets");
var query = "SELECT * FROM Assets WHERE AssetNumber = @0 AND SerialNumber = @1";
var record = db.QuerySingle(query, assetNumber, serialNumber);
if (record != null) {
var updateCommand =
@"UPDATE Assets SET
AssetNumber=@0,
SerialNumber=@1,
AssetType=@2,
Model=@3,
Location=@4,
DateModified=@5,
Comments=@6
WHERE AssetNumber=@0 AND SerialNumber=@1";
db.Execute(updateCommand, assetNumber, serialNumber, assetType, model, toCube, currentTime, comments);
} else {
var insertCommand =
@"INSERT INTO Assets (AssetNumber, SerialNumber, AssetType, Model, Location, DateModified, Comments)
VALUES (@0, @1, @2, @3, @4, @5, @6)";
db.Execute(insertCommand, assetNumber, serialNumber, assetType, model, toCube, currentTime, comments);
}
这段代码嵌套在前面代码块中列出的if(IsPost…
方法中,并替换了之前的SQL语句。它仍然需要一些工作来进行额外的检查,但基本逻辑正是我希望它做的
感谢@Steve为我指明了正确的方向!
UPDATE
s通常有一个WHERE
子句-但是我不熟悉匹配的语言,但是没有WHERE
的普通更新将更新每一行。Sql Server Compact Edition不支持合并@Steve我甚至不支持请考虑检查类似的内容。感谢您为我节省了很多麻烦!我将在明天尝试制定一个重新格式化的版本,而不考虑合并。很高兴能提供帮助。感谢@DourHighArch,重新提交我的更新作为问题的答案。如果这是Sql Server,这将是正确的,但从堆栈跟踪异常来看,这显然是Sql Server Compact版不支持合并。尽管这对CE不起作用(我的错,我不知道这是个问题!),但首先知道我的合并语句有什么问题是非常有帮助的。谢谢!