[英]SQL CE statement to update or insert assets in ASP.Net
我正在創建一個Web表單以將信息插入數據庫。 我對此沒有任何問題,但可以進行設置以插入鍵入的信息,但是如果該條目已經存在於數據庫中,則嘗試重新格式化命令以更新信息時會遇到麻煩。
嘗試提交更改時出現以下錯誤:
解析查詢時出錯。 [令牌行號= 1,令牌行偏移量= 7,令牌錯誤=資產]
說明:執行當前Web請求期間發生未處理的異常。 請查看堆棧跟蹤,以獲取有關錯誤及其在代碼中起源的更多信息。
異常詳細信息:System.Data.SqlServerCe.SqlCeException:解析查詢時出錯。 [令牌行號= 1,令牌行偏移量= 7,令牌錯誤=資產]
源錯誤:
第39行:INSERT(資產編號,序列號,資產類型,模型,位置,修改日期,注釋),第40行:VALUES(@ 0,@ 1,@ 2,@ 3,@ 4,@ 5,@ 6)“; 第41行:db.Execute(insertCommand,assetNumber,serialNumber,assetType,model,toCube,currentTime,注釋);第42行:Response.Redirect(“〜/ AssetLookup”);第43行:}
代碼在第41行出現錯誤。我在下面的代碼中唯一更改的是SQL語句,因此,我確定這有問題。 這是我第一次嘗試使用SQL。 我做了一些挖掘工作,試圖弄清楚該語句出了什么問題,但是特別是在使用USING ... 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 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語句時會感到混亂,但是在USING ... ON部分上特別感到困惑。 對於其余的代碼/數據庫,所有表列和變量名均已正確設置。 有人可以提供一些有關該命令應使用的語法的建議嗎?
更新:
基於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或通過代碼運行查詢(我通常堅持使用存儲的proc),但這聽起來像是要比較傳入的資產和序列號,桌子上實際有什么,以前沒有的東西不會做。
以一種非常基本的方式,我通過將一些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為我指出正確的方向!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.