C# FBC命令列未知?
我正在使用C# FBC命令列未知?,c#,firebird,firebird2.5,firebird-.net-provider,C#,Firebird,Firebird2.5,Firebird .net Provider,我正在使用FBCommand将数据插入ASP.NET中的单个表中,并使用 在insert方法中,我创建以下命令: INSERT INTO PERSONEN ( NACHNAME, VORNAME, GEBURTSDATUM, STRASSE, PLZ, ORT, LAND, TELEFONNUMMER, EMAIL) VALUES (:Nachname, :Vorname, :Geburtsdatum, :Strasse, :PLZ, :Ort, :Land, :Telefonnummer,
FBCommand
将数据插入ASP.NET中的单个表中,并使用
在insert方法中,我创建以下命令:
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;
(我在这里使用:
而不是@
,因为当我使用@
作为参数时,它给了我一个未知的标记“@”错误)
当它试图以“ExecuteOnQuery”的形式运行命令时,我得到了SQL错误-206列Unknown NACHNAME
我确信这里没有打字错误:
我不知道可能是什么错误。我甚至还关注了Firebird主页上的FAQ(奇怪的是,他们用@
添加了参数,但那是另一个故事)
以下是该方法的完整代码:
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;
}
private int InsertOrUpdateRecord(bool-ForceNew)
{
string命令=”;
如果(新的)
{
command=“插入PERSONEN(NACHNAME、VORNAME、GEBURTSDATUM、STRASSE、PLZ、ORT、LAND、TELEFONNUMMER、电子邮件)”+
“值(:Nachname,:Vorname,:Geburtsdatum,:Strasse,:PLZ,:Ort,:Land,:telefonnumer,:Email)”;
}
其他的
{
command=“更新或插入PERSONEN(ID、NACHNAME、VORNAME、GEBURTSDATUM、STRASSE、PLZ、ORT、LAND、TELEFONNUMMER、电子邮件)”+
“值(:ID,:Nachname,:Vorname,:Geburtsdatum,:Strasse,:PLZ,:Ort,:Land,:telefonnumer,:Email)”;
}
命令+=“将ID返回到:Returnvalue;”;
FbCommand cmd=新FbCommand(命令);
cmd.CommandType=CommandType.Text;
//ID在Sonderfall中,由keine Textbox控制,因此在Schleife的文件夹中可以看到,这是只读的。
cmd.Parameters.AddWithValue(“:”+gdvPersonDetailedData.Columns[0]。HeaderText,gdvPersonDetailedData.Rows[0]。单元格[0]。Text);/@ID
对于(int i=1;i
Firebird ADO.net提供程序(FirebirdSql.Data.FirebirdClient)不支持将:
作为参数前缀,它只支持将@
作为参数前缀。使用:
作为前缀是导致错误的原因,列未知错误由:Nachname
参数触发,而不是由列列表中的列Nachname
触发。冒号未包含在错误消息中的事实与Firebird中冒号前缀名称的解析方式有关(Firebird仅支持PSQL(Firebird的过程语言)中的命名参数,但DSQL(动态SQL,Firebird的“正常”查询语言)的解析器会处理这些参数)
使用@
时出现的问题是由于在查询中的@Returnvalue中包含了。INTO
子句仅在PSQL中有效,在DSQL中无效
接受返回
值的正确方法是通过返回
子句中列的名称引用该值(在Firebird 3中,您也可以将其命名为别名):
/。。。
命令+=“返回ID”;
// ...
cmd.Parameters.Add(“ID”,fbdtype.Integer).Direction=ParameterDirection.Output;
// ...
返回(int)命令参数[“ID”]值;
我不认为您实际上在FlameRobin中尝试了完全相同的查询,因为您的returning
子句被破坏了。我最初尝试将@用于我的所有参数,然后它只说@是无效/未知的标记。我通过编写存储过程解决了问题。这就成功了。我希望我再也不用碰火鸟或火鸟了。他们都嘲笑我,让我失望。@Moonpaw如果你试图在FlameRobin中使用@
,那就行不通了。Firebird本身只知道位置参数(?
),使用@
是特定于FirebirdSql.Data.FirebirdClient的,它将在这些命名参数和位置参数之间进行转换。@Moonpaw无论如何,很遗憾听到您不喜欢这些问题。我很好奇,Firebird到底是怎么看不起你的?