C# ORA-01036:更新gridview时变量名称/编号非法

C# ORA-01036:更新gridview时变量名称/编号非法,c#,asp.net,oracle,gridview,C#,Asp.net,Oracle,Gridview,我想在gridview中更新该行的一个单元格。但我也有错误 ORA-01036:非法变量名称/编号 在cmd.ExecuteNonQuery() 下面是我的代码:- protected void SaveChanges(object sender, EventArgs e) { myConn.Open(); string excelData = Grid1ExcelData.Value; string excelDeletedIds = Grid1ExcelDele

我想在gridview中更新该行的一个单元格。但我也有错误

ORA-01036:非法变量名称/编号

cmd.ExecuteNonQuery()

下面是我的代码:-

protected void SaveChanges(object sender, EventArgs e)
{   
    myConn.Open();
    string excelData = Grid1ExcelData.Value;
    string excelDeletedIds = Grid1ExcelDeletedIds.Value;

    string[] rowSeparator = new string[] { "|*row*|" };
    string[] cellSeparator = new string[] { "|*cell*|" };

    string[] dataRows = excelData.Split(rowSeparator, StringSplitOptions.None);

    for (int i = 0; i < dataRows.Length; i++)
    {
        string[] dataCells = dataRows[i].Split(cellSeparator, StringSplitOptions.None);
        string mkey = dataCells[0];
        string shipName = dataCells[1];
        string shipCity = dataCells[2];
        string shipAddress = dataCells[3];
        string shipCountry = dataCells[4];
        string orderDate = dataCells[5];
        bool sent = dataCells[6] == "yes";

        string insertUpdateQuery = "";
        if (!string.IsNullOrEmpty(mkey))
        {
            insertUpdateQuery = "UPDATE B_Order_new SET ShipName = @ShipName, ShipCity = @ShipCity, ShipAddress = @ShipAddress, ShipCountry = @ShipCountry, OrderDate = @OrderDate, Sent = @Sent WHERE MKEY = @MKEY";
        }
        else
        {
            insertUpdateQuery = "INSERT INTO B_Order_new (ShipName, ShipCity, ShipAddress, ShipCountry, OrderDate, Sent) " +
                                 "VALUES(@ShipName, @ShipCity, @ShipAddress, @ShipCountry, @OrderDate, @Sent)";
        }
        OracleCommand cmd = new OracleCommand(insertUpdateQuery, myConn);
        var orderedOn = DateTime.ParseExact(orderDate, "dd/MM/yyyy", null);
        cmd.Parameters.Add("@ShipName", OracleType.VarChar).Value = shipName;
        cmd.Parameters.Add("@ShipCity", OracleType.VarChar).Value = shipCity;
        cmd.Parameters.Add("@ShipAddress", OracleType.VarChar).Value = shipAddress;
        cmd.Parameters.Add("@ShipCountry", OracleType.VarChar).Value = shipCountry;
        cmd.Parameters.Add("@OrderDate", OracleType.DateTime).Value = orderedOn;
        cmd.Parameters.Add("@Sent", OracleType.Char).Value = true;

        if (!string.IsNullOrEmpty(mkey))
        {
            cmd.Parameters.Add("@MKEY", OracleType.Number).Value = mkey;
        }
        cmd.ExecuteNonQuery();
        if (insertUpdateQuery != "")
        {
            Page.ClientScript.RegisterStartupScript(typeof(Page), "CloseScript", "alert('Data Updated succesfully');", true);
        }
    }
    if (!string.IsNullOrEmpty(excelDeletedIds))
    {
        OracleCommand deleteComm = new OracleCommand("DELETE FROM Orders WHERE OrderID IN (" + excelDeletedIds + ")", myConn);
        deleteComm.ExecuteNonQuery();
    }
    myConn.Close();
    Grid1.DataBind();
}
受保护的void SaveChanges(对象发送方、事件参数e)
{   
myConn.Open();
字符串excelData=Grid1ExcelData.Value;
字符串excelDeletedIds=Grid1ExcelDeletedIds.Value;
字符串[]行分隔符=新字符串[]{“|*行*|”};
字符串[]单元格分隔符=新字符串[]{“|*单元格*|”};
string[]dataRows=excelData.Split(行分隔符,StringSplitOptions.None);
for(int i=0;i
问题在于您使用了错误的绑定变量语法(看起来您使用的是SQL Server参数绑定语法)。Oracle的ADO.NET提供程序希望您使用
前缀,而不是
@

因此,请尝试以下方法:

insertUpdateQuery = "UPDATE B_Order_new SET ShipName = :ShipName, ShipCity = :ShipCity, ...
然后在设置值时,不需要为其添加前缀:

cmd.Parameters.Add("ShipName", OracleType.VarChar).Value = shipName;
cmd.Parameters.Add("ShipCity", OracleType.VarChar).Value = shipCity;
...
编辑


另外,如果要按名称绑定参数,请确保将
oraclecondmand.BindByName
属性设置为
true
。否则,将按位置进行绑定。

现在出现错误,错误为
ORA-00933:SQL命令未正确结束
cmd.ExecuteNonQuery()这是我的更新查询
insertUpdateQuery=“更新B_订单_新设置ShipName=:ShipName,ShipCity=:ShipCity,ShipAddress=:ShipAddress“+”ShipCountry=:ShipCountry,OrderDate=:OrderDate,Sent=:Sent where MKEY=:MKEY”
您在
ShipAddress
ShipCountry
之间缺少一个逗号。我还添加了一个关于确保将
OracleCommand.BindByName
设置为
true
的编辑,以确保按名称而不是按位置绑定参数。我没有得到您的
OracleCommand.BindByName
点。你能解释一下我在哪里没有用这个吗??