вставка файла как Varbinary (MAX) в SQL Server 2008

Я пытаюсь вставить значения в свою таблицу, содержащую varbinary(MAX), и файл, который я пытаюсь вставить, это byte[]

 public DataTable add1(string docName , byte[] doc)
{
    DBAdaptor db = new DBAdaptor();
    string query = "INSERT INTO [Document]    (DocumentName, DocumentData) OUTPUT       inserted.DocumentID VALUES        (N'" + docName + "' , " + doc + ")";
    return db.QueryRide(query);
}

и я получаю это исключение:

Имя объекта или столбца отсутствует или пусто. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других утверждений ищите пустые псевдонимы. Псевдонимы, определенные как "" или [], не допускаются. Измените псевдоним на допустимое имя.

Неправильный синтаксис рядом с ''.

и вот функция, которая выполняет мой запрос:

public DataTable QueryRide(string query)
{
    DataTable dt = new DataTable();
    string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;        
    SqlConnection con = new SqlConnection(conStr);
    SqlCommand cmd = new SqlCommand(query, con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    try
    {
        con.Open();
        da.Fill(dt);
    }
    catch (Exception)
    {
       throw;
    }
    finally
    {
        if (con.State == ConnectionState.Open)
            con.Close();
    }
    return dt;
}

как я могу вставить этот байт [] в свою таблицу? Благодарность


person ePezhman    schedule 08.10.2011    source источник
comment
возможный дубликат SQL: последовательное выполнение UPDATE .WRITE в столбце VarBinary   -  person bzlm    schedule 08.10.2011
comment
Вы должны всегда использовать параметризованные запросы вместо того, чтобы объединять свои операторы SQL вместе!! В противном случае вы подвергаетесь высокому риску атак с помощью SQL-инъекций....   -  person marc_s    schedule 08.10.2011


Ответы (1)


Попробуй это:

private static int insertDocument(string name, byte[] data)
{
    using (SqlConnection cn = new SqlConnection("..."))
    using (SqlCommand cm = cn.CreateCommand())
    {
        cm.CommandText = @"
            INSERT INTO [Document] (DocumentName, DocumentData)
            OUTPUT      inserted.DocumentID
            VALUES      (@Name, @Data)";
        cm.Parameters.AddWithValue("@Name", name);
        cm.Parameters.AddWithValue("@Data", data);
        cn.Open();
        return (int)cm.ExecuteScalar();
    }
}
person Rubens Farias    schedule 08.10.2011
comment
спасибо, это работает довольно хорошо. но в чем отличия? и когда я хочу выбрать это, я должен написать такой запрос? еще раз спасибо :) - person ePezhman; 08.10.2011
comment
Я не знаю, как работает этот DBAdaptor (он родной?), но внутри он должен делать то же самое. Кроме того, всегда используйте параметризованные запросы, как сказал marc_s - person Rubens Farias; 08.10.2011
comment
DBAdaptor имеет функцию, подобную той, которую я только что добавил выше. - person ePezhman; 08.10.2011
comment
Также обратите внимание, что в этом случае вам просто нужно целое число, а не таблица данных. - person Rubens Farias; 08.10.2011