मैं धाराप्रवाह NHibernate का उपयोग करने के लिए एक डेटाबेस है कि डेटाबेस में से कुछ की जरूरत है स्थानांतरित करने के लिए कोशिश कर रहा हूँ 'की मालिश'। स्रोत डेटाबेस एक एमएस एक्सेस डेटाबेस है और वर्तमान तालिका जो मैं फंस गया हूं वह ओएलई ऑब्जेक्ट फ़ील्ड वाला है। लक्ष्य डेटाबेस एक एमएस एसक्यूएल सर्वर एक्सप्रेस डेटाबेस है।NHibernate OutOfMemoryException से क्वेरी बड़े बाइट []
इकाई में मैं तो बस इस फ़ील्ड लेकिन जब तथापि लोड हो रहा है तब भी जब बस लोड हो रहा है कि एक ही रिकार्ड के लिए एक क्षेत्र मैं एक System.OutOfMemoryException
byte[] test = aSession.Query<Entities.Access.Revision>().Where(x => x.Id == 5590).Select(x => x.FileData).SingleOrDefault<byte[]>();
मैं तो लागू करने की कोशिश की मार गया था एक byte[]
के रूप में परिभाषित किया था blob type listed here लेकिन अब जब चल रहा की कोई त्रुटि प्राप्त है कि:
" 'System.Byte []' टाइप प्रकार की वस्तु कास्ट करने में असमर्थ के लिए 'TestProg.DatabaseConverter.Entities.Blob'।"}
मैं कल्पना नहीं कर सकते ओले वस्तु किसी भी 100MB से अधिक है, लेकिन नहीं की जाँच करने में सक्षम है। वहाँ धाराप्रवाह NHibernate का उपयोग कर एक डेटाबेस के इस बाहर कॉपी और अन्य पर सहेजें या मैं अन्य विकल्पों को देखने की आवश्यकता होगी के लिए किसी भी अच्छा तरीका है?
इन प्रसंस्करण के लिए मेरे सामान्य पाश है: एक से दूसरे में और कुछ संस्थाओं के लिए
IList<Entities.Access.Revision> result;
IList<int> recordIds = aSession.Query<Entities.Access.Revision>().Select(x => x.Id).ToList<int>();
foreach (int recordId in recordIds)
{
result = aSession.Query<Entities.Access.Revision>().Where(x => x.Id == recordId).ToList<Entities.Access.Revision>();
Save(sqlDb, result);
}
सहेजें समारोह सिर्फ प्रतियां गुण डेटा में हेरफेर करने के लिए या डेटा की समस्याओं से संबंधित उपयोगकर्ता के लिए प्रतिक्रिया देने के लिए किया जाता है। मैं दोनों डेटाबेस के लिए स्टेटलेस सत्र का उपयोग कर रहा हूँ।
-
आगे वस्तुओं उस पर फांसी प्रतीत होता है परीक्षण से 60-70mb के बारे में कर रहे हैं। मैं वर्तमान में GetBytes का उपयोग कर OleDbDataReader के साथ डेटा को हथियाने का परीक्षण कर रहा हूं।
-
अद्यतन (नवम्बर 24): मैं अभी तक इस NHibernate के साथ काम करने के लिए पाने के लिए एक रास्ता खोजने के लिए है। मुझे यह नियमित डीबी कमांड ऑब्जेक्ट्स के साथ काम मिल गया। मैंने उस फंक्शन के लिए कोड डाला है जिसे मैंने नीचे दिया है जो किसी को भी जिज्ञासा देता है। यह मेरे डेटाबेस कनवर्टर से कोड है इसलिए 'ए' के साथ prefixed ऑब्जेक्ट्स डेटाबेस डेटाबेस ऑब्जेक्ट्स हैं और 's' sql हैं।
public void MigrateBinaryField(int id, string tableName, string fieldName)
{
var aCmd = new OleDbCommand(String.Format(@"SELECT ID, {0} FROM {1} WHERE ID = {2}", fieldName, tableName, id), aConn);
using (var reader = aCmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
if (reader[fieldName] == DBNull.Value)
return;
long read = 0;
long offset = 0;
// Can't .WRITE a NULL column so need to set an initial value
var sCmd = new SqlCommand(string.Format(@"UPDATE {0} SET {1} = @data WHERE OldId = @OldId", tableName, fieldName), sConn);
sCmd.Parameters.AddWithValue("@data", new byte[0]);
sCmd.Parameters.AddWithValue("@OldId", id);
sCmd.ExecuteNonQuery();
// Incrementally store binary field to avoid OutOfMemoryException from having entire field loaded in memory
sCmd = new SqlCommand(string.Format(@"UPDATE {0} SET {1}.WRITE(@data, @offset, @len) WHERE OldId = @OldId", tableName, fieldName), sConn);
while ((read = reader.GetBytes(reader.GetOrdinal(fieldName), offset, buffer, 0, buffer.Length)) > 0)
{
sCmd.Parameters.Clear();
sCmd.Parameters.AddWithValue("@data", buffer);
sCmd.Parameters.AddWithValue("@offset", offset);
sCmd.Parameters.AddWithValue("@len", read);
sCmd.Parameters.AddWithValue("@OldId", id);
sCmd.ExecuteNonQuery();
offset += read;
}
}
}
}
हेव आपने यह कोशिश की? https://github.com/bittercoder/Lob – Najera
@ नजरा मैंने इसे एक शॉट दिया और काम नहीं किया। मैं विनिर्देशों को याद नहीं कर सकता लेकिन लगता है कि अभी भी स्मृति अपवादों से बाहर निकलना याद है। हालांकि यह थोड़ी देर हो गया है, हालांकि उस पर 100% नहीं है। –
क्या आप हमें मैपिंग के साथ प्रदान कर सकते हैं? – TedOnTheNet