FBCommand 列未知?
FBCommand Column Unknown?
我正在使用 FBCommand
将数据插入 ASP.NET 中的单个 table 并使用 <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 列未知 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;
}
Firebird ADO.net Provider (FirebirdSql.Data.FirebirdClient),不支持:
作为参数前缀,它只支持@
作为参数前缀。使用 :
作为前缀是错误的原因,Column Unknown 错误是由 :Nachname
参数触发的,而不是由列列表中的列 NACHNAME
触发的。错误消息中不包含冒号的事实与冒号前缀名称在 Firebird 中的解析方式有关(Firebird 仅支持 PSQL(Firebird 的过程语言)中的命名参数,但 D[=30 的解析器=](动态 SQL,Firebird 的 'normal' 查询语言)会处理它们。
您在使用 @
时遇到的问题是由查询中包含 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;
我正在使用 FBCommand
将数据插入 ASP.NET 中的单个 table 并使用 <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 列未知 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;
}
Firebird ADO.net Provider (FirebirdSql.Data.FirebirdClient),不支持:
作为参数前缀,它只支持@
作为参数前缀。使用 :
作为前缀是错误的原因,Column Unknown 错误是由 :Nachname
参数触发的,而不是由列列表中的列 NACHNAME
触发的。错误消息中不包含冒号的事实与冒号前缀名称在 Firebird 中的解析方式有关(Firebird 仅支持 PSQL(Firebird 的过程语言)中的命名参数,但 D[=30 的解析器=](动态 SQL,Firebird 的 'normal' 查询语言)会处理它们。
您在使用 @
时遇到的问题是由查询中包含 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;