【问题标题】:Why I get an exception error on a database insert command?为什么我在数据库插入命令上收到异常错误?
【发布时间】:2017-04-02 01:11:41
【问题描述】:
public static string storeAvatar(string avatar, string gender, string species, int playerforeignkey )
{ 
    try
    {
        OleDbConnection myConnection = GetConnection();
        OleDbCommand dbCommand = new OleDbCommand();

        dbCommand.CommandText = "INSERT INTO AVATARS ([AVATAR_ID],[AVATAR],[DOB],[STRENGTH],[GENDER],[HOARD],[SPECIES], [METAMORPHOSED], [COST],[PLAYERID_FK]) values (?,?,?,?,?,?,?,?,?,?)"; // command to get high score data
        dbCommand.Parameters.AddWithValue("@id", "AVATARS_SEQ.NEXTVAL");
        dbCommand.Parameters.AddWithValue("@avatar", avatar);
        dbCommand.Parameters.AddWithValue("@date", "TO_CHAR(" + DateTime.Now.ToString("dd/mm/yyyy")+")");
        dbCommand.Parameters.AddWithValue("@strength", 0);
        dbCommand.Parameters.AddWithValue("@gender", gender);
        dbCommand.Parameters.AddWithValue("@hoard", 0);
        dbCommand.Parameters.AddWithValue("@species", species);
        dbCommand.Parameters.AddWithValue("@meta", 0);
        dbCommand.Parameters.AddWithValue("@cost", 0);
        dbCommand.Parameters.AddWithValue("@playerfk", playerforeignkey);
        dbCommand.Connection = myConnection;
        myConnection.Open();
        dbCommand.ExecuteNonQuery();
        myConnection.Close();
    }
    catch (Exception ex)
    {

    }
    return "ERROR";
}

异常错误说我需要错过SELECT 关键字,但是我想要INSERT 而不是SELECT

EXCEPTION = "处理过程中出现一个或多个错误 命令。\r\nORA-00928: 缺少 SELECT 关键字"

【问题讨论】:

  • 你能分享确切的异常信息吗?查询中的参数被提到为?,?,?,?,?,?,?,?,是故意的吗?您需要在那里使用实际的命令名称。

标签: c# sql database oracle oledbconnection


【解决方案1】:

首先,更新命令文本以使用实际参数名称,其次使用参数的目的也是为了避免您尝试使用参数进行的 SQL 注入。

不需要@id 参数,因为该值可以像TO_CHAR 函数一样直接放入字符串中。

//..other code removed for brevity
dbCommand.CommandText = "INSERT INTO AVATARS ([AVATAR_ID],[AVATAR],[DOB],[STRENGTH],[GENDER],[HOARD],[SPECIES], [METAMORPHOSED], [COST],[PLAYERID_FK]) VALUES (AVATARS_SEQ.NEXTVAL,@avatar,TO_CHAR(@date),@strength,@gender,@hoard,@species,@meta,@cost,@playerfk)";
dbCommand.Parameters.AddWithValue("@avatar", avatar);
dbCommand.Parameters.AddWithValue("@date", DateTime.Now.ToString("dd/mm/yyyy"));
dbCommand.Parameters.AddWithValue("@strength", 0);
dbCommand.Parameters.AddWithValue("@gender", gender);
dbCommand.Parameters.AddWithValue("@hoard", 0);
dbCommand.Parameters.AddWithValue("@species", species);
dbCommand.Parameters.AddWithValue("@meta", 0);
dbCommand.Parameters.AddWithValue("@cost", 0);
dbCommand.Parameters.AddWithValue("@playerfk", playerforeignkey);
//..other code removed for brevity

事实上,我什至建议将所有常量值直接放入查询中,并将参数减少到仅预期会频繁更改的参数。

例如

//..other code removed for brevity
dbCommand.CommandText = "INSERT INTO AVATARS ([AVATAR_ID],[AVATAR],[DOB],[STRENGTH],[GENDER],[HOARD],[SPECIES], [METAMORPHOSED], [COST],[PLAYERID_FK]) 
VALUES (AVATARS_SEQ.NEXTVAL,@avatar,TO_CHAR(@date),0,@gender,0,@species,0,0,@playerfk)";
dbCommand.Parameters.AddWithValue("@avatar", avatar);
dbCommand.Parameters.AddWithValue("@date", DateTime.Now.ToString("dd/mm/yyyy"));
dbCommand.Parameters.AddWithValue("@gender", gender);
dbCommand.Parameters.AddWithValue("@species", species);
dbCommand.Parameters.AddWithValue("@playerfk", playerforeignkey);
//..other code removed for brevity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2019-09-01
    相关资源
    最近更新 更多