嗯,我已经看到了一些关于这方面的帖子,我能找到的最好答案是使用Parameters,但在我的情况下不可能:
我制作了一个单独的库,用于向 MySQL 或 MSSQL 发送请求,具有以下功能:
public long Insert(string query)
{
if (this.OpenConnection() == true)
{
if (isMySQL)
{
MySqlCommand cmd = new MySqlCommand(query.Replace("[v-steel].", ""), connection);
cmd.ExecuteNonQuery();
long lastId = cmd.LastInsertedId;
this.CloseConnection();
return lastId;
}
else
{
using (SqlCommand command = new SqlCommand(query + "; SELECT SCOPE_IDENTITY () As NewID", MSconnection))
{
SqlDataReader dataReader = command.ExecuteReader();
if (dataReader.HasRows)
{
dataReader.Read();
long lastId = long.Parse(dataReader["NewID"].ToString().Trim());
return lastId;
}
}
}
}
return -1;
}
因此,由于此函数对于任何查询/表都是全局的,因此我无法使用参数。
我最终想要的是能够在我的数据库中发送撇号、逗号等字符...我发现的所有内容都是替换函数或参数,是否有一种“更简单”的方法可以在我的函数中实现插入和更新,所以我确信我永远不会收到错误消息,并且这些字符将被考虑在内。 通常我会遇到发回用户评论的问题,评论里可以写任何东西。
编辑:
第二种可能性是在插入功能中编辑我的请求(在发送查询之前)
发送的请求看起来像这样(在我的具体示例中):
string requete = "INSERT INTO [v-steel].assemblage_avancement_histo(ID_ASS_AV,ID_USER,ID_OP,ID_OP_NEXT,COMM) VALUES(" + this.IdAssAv + "," + this.IdUser + "," + this.IdOp+","+this.IdOpNext+",\'"+this.Comm+"\')";
this.ID=DataBase.Insert(requete);
正如你所理解的,我的问题是在“this.Comm”上遇到的,这是用户留下的评论,我希望允许用户写任何他们想要的东西。
编辑:
根据 MarcGravell 的评论,我添加了一个新对象 ElementInput
public class ElementInput
{
private string field;
public string Field
{
get { return field; }
set { field = value; }
}
private string valeur;
public string Valeur
{
get { return valeur; }
set { valeur = value; }
}
}
然后修改插入函数如下:
public long Insert(string table,List<ElementInput> listElements)
{
if (this.OpenConnection() == true)
{
if (isMySQL)
{
string query = "INSERT INTO [v-steel]." + table + "(";
for(int i=0;i<listElements.Count();i++)
{
if(i>0)
{
query += ",";
}
query += listElements[i].Field;
}
query += ") values (";
for (int i = 0; i < listElements.Count(); i++)
{
if (i > 0)
{
query += ",?valeur"+i;
}
else
{
query += "?valeur"+i;
}
}
query += ")";
MySqlCommand cmd= new MySqlCommand(query.Replace("[v-steel].", ""), connection);
for(int i=0;i< listElements.Count(); i++)
{
cmd.Parameters.Add(new MySqlParameter("valeur"+i, listElements[i].Valeur));
}
cmd.ExecuteNonQuery();
long lastId = cmd.LastInsertedId;
this.CloseConnection();
return lastId;
}
else
{
//same thing for MSSQL
}
}
return -1;
}
剩下的唯一一件事就是编辑我调用 Insert() 的所有函数,以发送要设置的字段列表。
编辑(4年后):对于读过这篇文章的人来说,没有必要像我一样浪费时间尝试没有参数,这会浪费时间,有一天你会完成这样做,所以最好改变你的早点养成习惯。
将 ' 替换为 '' ,即 this.Comm.Replace("'", "''")
string requete = "INSERT INTO [v-steel].assemblage_avancement_histo(ID_ASS_AV,ID_USER,ID_OP,ID_OP_NEXT,COMM) VALUES(" + this.IdAssAv + "," + this.IdUser + "," + this.IdOp+","+this.IdOpNext+",\'"+this.Comm.Replace("'", "''")+"\')";
this.ID=DataBase.Insert(requete);