1、建议使用存储过程;
2、如果一定要使用text,建议还是跟sp一样的使用sqlparameter对象这样的好处就是,它可以在内部实现你的数据类型转换(就连stream到byte[]的转换都不需要了)3、使用MSDN帮助里面的那个例子,即用一个空的image占位(insert),然后根据此记录的PK获取刚才那个image的指针,然后给这个指针加上stream的地址(这一步用C#写),然后在用update语句(还是要用sqlparameter)

解决方案 »

  1.   

    能不能给我MSDN帮助里面的那个例子的地址啊,谢谢。
      

  2.   

    ms-help://MS.MSDNQTR.2003FEB.1033/cpguide/html/cpconconservingresourceswhenwritingblobvaluestosqlserver.htm
      

  3.   

    对了
    这个是MSDN library中的地址
      

  4.   

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.IO;public class EmployeeData
    {
      public static void Main()
      {
        DateTime hireDate = DateTime.Parse("4/27/98");
        int newID  = AddEmployee("Smith", "John", "Sales Representative", hireDate, 5, "smith.bmp");
        Console.WriteLine("New Employee added. EmployeeID = " + newID);
      }  public static int AddEmployee(string lastName, string firstName, string title, DateTime hireDate , int reportsTo, string photoFilePath)
      {
        SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;");    SqlCommand addEmp  = new SqlCommand("INSERT INTO Employees (LastName, FirstName, Title, HireDate, ReportsTo, Photo) " +
          "Values(@LastName, @FirstName, @Title, @HireDate, @ReportsTo, 0x0);" +
          "SELECT @Identity = SCOPE_IDENTITY();" +
          "SELECT @Pointer = TEXTPTR(Photo) FROM Employees WHERE EmployeeID = @Identity", nwindConn);    addEmp.Parameters.Add("@LastName",  SqlDbType.NVarChar, 20).Value = lastName;
        addEmp.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = firstName;
        addEmp.Parameters.Add("@Title",     SqlDbType.NVarChar, 30).Value = title;
        addEmp.Parameters.Add("@HireDate",  SqlDbType.DateTime).Value     = hireDate;
        addEmp.Parameters.Add("@ReportsTo", SqlDbType.Int).Value          = reportsTo;    SqlParameter idParm = addEmp.Parameters.Add("@Identity", SqlDbType.Int);
        idParm.Direction = ParameterDirection.Output;
        SqlParameter ptrParm = addEmp.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
        ptrParm.Direction = ParameterDirection.Output;    nwindConn.Open();    addEmp.ExecuteNonQuery();    int newEmpID = (int)idParm.Value;    StorePhoto(photoFilePath, (byte[])ptrParm.Value, nwindConn);    nwindConn.Close();    return newEmpID;
      }  public static void StorePhoto(string fileName, byte[] pointer,  SqlConnection nwindConn)
      {
        int bufferLen = 128;  // The size of the "chunks" of the image.    SqlCommand appendToPhoto = new SqlCommand("UPDATETEXT Employees.Photo @Pointer @Offset 0 @Bytes", nwindConn);    SqlParameter ptrParm  = appendToPhoto.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
        ptrParm.Value = pointer;
        SqlParameter photoParm = appendToPhoto.Parameters.Add("@Bytes", SqlDbType.Image, bufferLen);
        SqlParameter offsetParm = appendToPhoto.Parameters.Add("@Offset", SqlDbType.Int);
        offsetParm.Value = 0;    //''''''''''''''''''''''''''''''''''
        // Read the image in and write it to the database 128 (bufferLen) bytes at a time.
        // Tune bufferLen for best performance. Larger values write faster, but
        // use more system resources.    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);    byte[] buffer = br.ReadBytes(bufferLen);
        int offset_ctr = 0;    while (buffer.Length > 0)
        {
          photoParm.Value = buffer;
          appendToPhoto.ExecuteNonQuery();
          offset_ctr += bufferLen;
          offsetParm.Value = offset_ctr;
          buffer = br.ReadBytes(bufferLen);
        }    br.Close();
        fs.Close();
      }
    }
      

  5.   

    声明
    这是MSDN中的例子,不是我写的啊
    hoho
    不过我也不会用这样的例子,太麻烦了