我正在构建sql_insert_string
以便在Microsoft.ApplicationBlocks.Data.SqlHelper
中使用,如下所示:
SqlHelper.ExecuteNonQuery(Transaction, CommandType.Text, sql_insert_string)
当我将鼠标悬停在SQL语句上时,它如下所示:
string sql_insert_string = "Insert into images_table(image_id, image_byte_array) values ('123', System.Byte[])
其中一个插入值是一个字节数组,如上所示。该变量在字节数组中具有值,例如byte [6738]。但是在构建sql_insert_string
之后,它将变为System.Byte[]
。 image_byte_array
列类型为varbinary(max)
。该数据库是SQL Server 2008.因此,数据库会引发以下错误:
对象或列名称缺失或为空。对于SELECT INTO语句,请验证每列是否具有名称。对于其他语句,请查找空别名。不允许使用定义为\“\”或[]的别名。将别名更改为有效名称。
答案 0 :(得分:2)
你可以像这样插入字节数组:
private void FireSql(byte[] input)
{
const string sql_insert_string =
"Insert into images_table(image_id, image_byte_array) values (@image_id, @image_byte_array)";
SqlTransaction transaction = null; //wherever you get the transaction obj from.
var imageIdParam = new SqlParameter("@image_id", SqlDbType.Int, 4)
{
Direction = ParameterDirection.Input,
Value = 123
}; //change the data type to whatever data type you are expecting
var byteParam = new SqlParameter("@image_byte_array", SqlDbType.VarBinary)
{
Direction = ParameterDirection.Input,
Size = input.Length,
Value = input
}; //change the data type to whatever data type you are expecting
SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, sql_insert_string, imageIdParam, byteParam);
}
我建议您查看ORM(https://en.wikipedia.org/wiki/Object-relational_mapping),例如实体框架(http://www.asp.net/entity-framework),为您完成所有这些工作,同时更加轻松地提高安全性和未来变更。
答案 1 :(得分:0)
构建SQL Query时应该使用参数,这显然会避免SQL注入攻击。您的查询如何构建仍然不清楚。 这样的事情应该适合你。
SqlParameter sParam = new SqlParameter("@image_byte_array", SqlDbType.VarBinary)
{
Value = image
};
SqlHelper.ExecuteNonQuery(Transaction, CommandType.Text, sql_insert_string, sParam)
答案 2 :(得分:-1)
您可以使用
string sql_insert_string =
String.Format("INSERT INTO images_table(image_id, image_byte_array) VALUES ('123', CAST('{0}' AS VARBINARY(MAX)))", System.Byte[].ToString());
是的,正如@marc_s所评论的那样,您不应该将SQL语句构建为安全问题。