1

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, VORNAME, GEBURTSDATUM, STRASSE, PLZ, ORT, LAND, TELEFONNUMMER, EMAIL)" +
        " VALUES (:Nachname, :Vorname, :Geburtsdatum, :Strasse, :PLZ, :Ort, :Land, :Telefonnummer, :Email)";
    }
    else
    {
        command = "UPDATE OR INSERT INTO PERSONEN (ID, NACHNAME, VORNAME, GEBURTSDATUM, STRASSE, PLZ, ORT, LAND, TELEFONNUMMER, EMAIL)" +
         " VALUES (:ID, :Nachname, :Vorname, :Geburtsdatum, :Strasse, :PLZ, :Ort, :Land, :Telefonnummer, :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;
}
4

1 回答 1

2

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;
于 2021-02-15T08:37:59.487 回答