首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FBCommand列未知?

FBCommand列未知?
EN

Stack Overflow用户
提问于 2021-02-15 08:41:16
回答 1查看 102关注 0票数 1

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

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

代码语言:javascript
复制
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 error -206 Column Unknown NACHNAME

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

我不知道错误是什么。我甚至在Firebird主页上关注了常见问题解答(奇怪的是,他们在@中添加了参数,但这是另一回事)

下面是该方法的完整代码:

代码语言:javascript
复制
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;
}
EN

Stack Overflow用户

回答已采纳

发布于 2021-02-15 16:37:59

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

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

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

代码语言:javascript
复制
// ...
command += " RETURNING ID";
// ...
cmd.Parameters.Add("ID", FbDbType.Integer).Direction = ParameterDirection.Output;
// ...
return (int)cmd.Parameters["ID"].Value;
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66201532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档