FBCommand 列未知?

问题描述

我使用 FBCommand 将数据插入到 ASP.NET 中的单个表中,并使用 <defaultConnectionFactory type="Firebirdsql.Data.EntityFramework6.FbConnectionFactory,EntityFramework.Firebird" />

在我的插入方法中,我创建了以下命令:

INSERT INTO PERSONEN ( NACHNAME,VORNAME,GEBURTSDATUM,STRASSE,PLZ,ORT,LAND,TELEFONNUMMER,EMAIL) 
VALUES (:Nachname,:Vorname,:Geburtsdatum,:Strasse,:PLZ,:Ort,:Land,:Telefonnummer,:Email) 
RETURNING ID into :Returnvalue;

(我在这里使用 : 而不是 @,因为当我使用 @ 作为参数时,它给了我一个未知的标记“@”错误

当它尝试将命令作为“ExecuteNonQuery”运行时,我收到 sql 错误 -206 Column UnkNown NACHNAME

我确信这里没有错别字: https://gyazo.com/6366c37e86a2073a157b38bd732e3ecd

我不知道错误可能是什么。我什至遵循了 Firebird 主页上的常见问题解答(奇怪的是,他们在那里添加了带有 @ 的参数,但那是另一回事了)

这是该方法的完整代码

private int InsertOrUpdateRecord(bool ForceNew)
{
    string command = "";
    if(ForceNew)
    {
        command = "INSERT INTO PERSONEN ( NACHNAME,EMAIL)" +
        " VALUES (:Nachname,:Email)";
    }
    else
    {
        command = "UPDATE OR INSERT INTO PERSONEN (ID,NACHNAME,EMAIL)" +
         " VALUES (:ID,:Nachname,:Email)";
    }
    command += " RETURNING ID into :Returnvalue;";
    FbCommand cmd = new FbCommand(command);
    cmd.CommandType = CommandType.Text;
   
    //ID ist ein Sonderfall,diese hat keine TextBox Controls so wie die Spalten in der folgenden For Schleife,da sie readonly ist.
    cmd.Parameters.AddWithValue(":" + gdvPersonDetailedData.Columns[0].HeaderText,gdvPersonDetailedData.Rows[0].Cells[0].Text);//@ID
    for (int i = 1; i < gdvPersonDetailedData.Columns.Count; i++)//Übrige Parameter
    {
        cmd.Parameters.AddWithValue(":" + gdvPersonDetailedData.Columns[i].HeaderText,((TextBox)gdvPersonDetailedData.Rows[0].Cells[i].Controls[0]).Text);
    }

    cmd.Parameters.Add(":Returnvalue",FbDbType.Integer).Direction = ParameterDirection.Output;//Für den Returnwert
    cmd.Connection = c;
    if(cmd.Connection.State != ConnectionState.Open)
    {
        cmd.Connection.open();
    }
    cmd.ExecuteNonQuery();
    return (int)cmd.Parameters[":Returnvalue"].Value;
}

解决方法

Firebird ADO.net Provider (FirebirdSql.Data.FirebirdClient),不支持 : 作为参数前缀,只支持 @ 作为参数前缀。使用 : 作为前缀是导致错误的原因,Column Unknown 错误由 :Nachname 参数触发,而不是由列列表中的列 NACHNAME 触发。错误消息中不包含冒号的事实与 Firebird 中冒号前缀名称的解析方式有关(Firebird 仅支持 PSQL(Firebird 的过程语言)中的命名参数,但 DSQL 的解析器(动态 SQL,Firebird 的“正常”)查询语言)确实会处理它们)。

您在使用 @ 时遇到的问题是由查询中包含 into @Returnvalue 引起的。 INTO 子句仅在 PSQL 中有效,在 DSQL 中无效。

接受 RETURNING 值的正确方法是通过 RETURNING 子句中的列名称引用它(在 Firebird 3 中,您也可以为它们设置别名):

// ...
command += " RETURNING ID";
// ...
cmd.Parameters.Add("ID",FbDbType.Integer).Direction = ParameterDirection.Output;
// ...
return (int)cmd.Parameters["ID"].Value;