2011-09-06 14 views
5

मैं जबकि एसक्यूएल सर्वर में varbinary (अधिकतम) के लिए डेटा प्रकार nvarchar से 2008.छवियों को एक varbinary (अधिकतम) कॉलम में कैसे स्टोर करें?

अंतर्निहित रूपांतरण एक छवि डालने इस follwing एसक्यूएल अपवाद हो रही है की अनुमति नहीं है। इस क्वेरी को चलाने के लिए CONVERT फ़ंक्शन का उपयोग करें

डेटाबेस में छवि कॉलम डेटाटाइप वर्बिनरी (MAX) है।

कृपया इस पर मेरी सहायता करें।

संपादित

कोड टिप्पणी

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath)); 
+0

कृपया उस छवि को दिखाएं जिसका उपयोग आप छवि आयात करने के लिए कर रहे हैं। –

+0

क्या आप बेस 64 प्रतिनिधित्व या कुछ डालने वाले हैं? ऐसा लगता है कि आप जिस 'एसक्लपैमरेटर' ऑब्जेक्ट का उपयोग कर रहे हैं, गलत तरीके से कॉन्फ़िगर किया गया है। – Tejs

उत्तर

2

ऐसा लगता है कि एक कॉलम कि NVARCHAR (एक मूल पाठ) डेटा प्रकार के लिए सेट है करने के लिए छवि डेटा सेट करने की कोशिश कर रहे से उठाया। या तो छवि डेटा को सही कॉलम पर सेट करें जो VARBINARY (MAX) है - या उस कॉलम को अपनी तालिका में जोड़ें यदि यह अभी तक मौजूद नहीं है। या आप वर्तमान कॉलम को VARBINARY (MAX) डेटा प्रकार में एक अल्टर टेबल कमांड के माध्यम से उपयोग कर सकते हैं, यदि यह वास्तव में सही कॉलम है और इसे अभी शुरू करने के लिए गलत डेटा प्रकार के साथ बनाया गया था।

+0

हाय मुफसा, नीचे ऐड विधि है, मुझे लगता है कि यहां समस्या है Iam क्या हो रहा है db टाइप मुझे बदलने की ज़रूरत है। कृपया मेरी मदद करें। paramaters.Add (getParam ("@ imageFilePath", DbType.AnsiString, imageFilePath)); – Indra

+0

नहीं - आपको प्रकार बदलने से ज्यादा करने की आवश्यकता है। आप SQL सर्वर को केवल उस फ़ाइल पथ को नहीं भेज सकते जिसे आपको बाइनरी डेटा भेजने की आवश्यकता है। –

+0

मैं इस पर नया हूं कि मैं कैसे कर सकता हूं? – Indra

13

उपयोग इस एक बाइट सरणी में फ़ाइल को पढ़ने के लिए: यह (मैं एक छवि वर्ग "उदाहरण" शामिल हैं कि उपयोग कर रहा हूँ का उपयोग कर

// Old fashioned way 
    public static byte[] ReadFile(string filePath) 
    { 
     byte[] buffer; 
     FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
     try 
     { 
      int length = (int)fileStream.Length; // get file length 
      buffer = new byte[length];   // create buffer 
      int count;       // actual number of bytes read 
      int sum = 0;       // total number of bytes read 

      // read until Read method returns 0 (end of the stream has been reached) 
      while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) 
       sum += count; // sum is a buffer offset for next reading 
     } 
     finally 
     { 
      fileStream.Close(); 
     } 
     return buffer; 
    } 

या

// Thanks Magnus! 
    byte[] data = System.IO.File.ReadAllBytes(filePath); 

तब छवि डेटा को बचाने मेरी उदाहरण में छवि जानकारी और बाइट सरणी। डेटा):

using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){ 
     cm.CommandType = CommandType.StoredProcedure; 
     cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id)); 
     cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title)); 
     if (instance.Data.Length > 0) 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data)); 
     } 
     else 
     { 
      cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));      
     } 

     cm.ExecuteNonQuery(); 
    ) 

और यहां एक उदाहरण संग्रहीत प्रक्रिया है:

CREATE PROCEDURE SaveImage 
(
@Id int OUTPUT 
,@Title nvarchar(50) 
,@Data varbinary(MAX) 
) 
AS 
SET NOCOUNT ON 
SET XACT_ABORT ON 

IF @Id IS NULL OR @Id <= 0 
BEGIN 
SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images] 
END 

INSERT INTO [dbo].[Images] (
[Id] 
,[Title] 
,[Data] 
) VALUES (
@Id 
,@Title 
,@Data 
) 
+9

System.IO.File.ReadAllBytes (filePath) – Magnus

+0

@ मैग्नस गुड कॉल। –

+0

आपको पैरामीटर में "instance.Data.Length" को प्रतिस्थापित करना चाहिए। VARBINARY (MAX) का प्रतिनिधित्व करने के लिए "-1" के साथ पंक्ति जोड़ें। –

4

आपको त्रुटि मिल रही है क्योंकि आप एक varbinary (अधिकतम) कॉलम में टेक्स्ट डालने का प्रयास कर रहे हैं; इसलिए, आप छवि को संग्रहित नहीं कर रहे हैं बल्कि छवि के लिए पथ भी हैं।

आप केवल पथ संग्रहीत करना चाहते हैं, तो आप तो छवि BYTES स्टोर करने के लिए आप से छवि को पढ़ने के लिए कोड की जरूरत चाहते हैं, तो varbinary (अधिकतम) varchar (max) को से अपने स्तंभ प्रकार बदलने एक बाइट सरणी के रूप में फ़ाइल और फिर आप तो जैसे डेटा सम्मिलित करें:

byte [] buffer = File.ReadAllBytes("Path/to/your/image/"); 
... 

SqlCommand command = .... 
command.CommandType=CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 

या

SqlCommand command = .... 
command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)"; 
command.Parameters.AddWithValue("@image",buffer); 
command.ExecuteNonQuery(); 
1

इन दो लेख पर एक नज़र डालें:

वे न केवल इसे कैसे करना है, लेकिन कैसे कुशलतापूर्वक धारा अर्थ विज्ञान का उपयोग कर यह करने के लिए दिखाई देते हैं।मेमोरी बाइट [] में पूरी छवि को लोड करने का बेवकूफ समाधान आपकी एएसपी प्रक्रिया में बहुत अधिक स्मृति का उपभोग करेगा। दिखाया गया कोड एमवीसी का उपयोग कर रहा है, लेकिन आप आसानी से इसे एपीएस फॉर्म में अनुकूलित कर सकते हैं।

संबंधित मुद्दे