簡體   English   中英

用於在ASP.Net中更新或插入資產的SQL CE語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM