আমি সি # কোড থেকে 2005 এসএসএল সার্ভারে সিএসভি ফাইল ডেটা বাল্ক আপলোড করতে চাই তবে আমি নীচের ত্রুটির মুখোমুখি হয়েছি -
কলিড 6 এর জন্য বিসিপি ক্লায়েন্ট থেকে একটি অবৈধ কলাম দৈর্ঘ্য পেয়েছে।
যখন বাল্ক অনুলিপি ডাটাবেস সার্ভারে লিখুন
উত্তর:
এক্সেলে থাকা ডেটা কলামগুলির মধ্যে একটি (কলাম আইডি 6) এর এক বা একাধিক সেল ডেটা রয়েছে যা ডাটাবেসে ডেটা কলম ডেটাটাইপের দৈর্ঘ্য অতিক্রম করে।
এক্সেলে ডেটা যাচাই করুন। ডাটাবেস টেবিল স্কিমার সাথে সম্মত হওয়ার জন্য এটির ফর্ম্যাটটির জন্য এক্সেলটিতে থাকা ডেটাও যাচাই করুন।
এটি এড়াতে, ডাটাবেস সারণিতে স্ট্রিং ডেটাটাইপের ডেটা দৈর্ঘ্য অতিক্রম করার চেষ্টা করুন।
আশাকরি এটা সাহায্য করবে.
আমি জানি এই পোস্টটি পুরানো তবে আমি এই একই সমস্যার মধ্যে পড়েছিলাম এবং শেষ পর্যন্ত কোন কলামটি সমস্যা তৈরি করছে তা নির্ধারণ করার জন্য একটি সমাধান বের করে এবং প্রয়োজনমতো এটি পুনরায় রিপোর্ট করার জন্য। আমি নির্ধারিত করেছি যে colid
স্কেলএক্সসেপ্টে ফিরে আসা শূন্য ভিত্তিতে নয় তাই মান পেতে আপনাকে এটি থেকে ১ টি বিয়োগ করতে হবে। এরপরে এটি _sortedColumnMappings
স্কেলবুলকপি'র অ্যারেলিস্টের সূচক হিসাবে ব্যবহৃত হয় যেমন স্ক্যালব্লককপির উদাহরণটিতে যুক্ত হওয়া কলাম ম্যাপিংয়ের সূচি নয়। একটি বিষয় লক্ষণীয় যে স্কেলবুলকপিটি প্রথম প্রাপ্ত ত্রুটিটি বন্ধ হয়ে যায় তাই এটি কেবল একমাত্র সমস্যা না হলেও এটি অন্তত বের করতে সহায়তা করে।
try
{
bulkCopy.WriteToServer(importTable);
sqlTran.Commit();
}
catch (SqlException ex)
{
if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))
{
string pattern = @"\d+";
Match match = Regex.Match(ex.Message.ToString(), pattern);
var index = Convert.ToInt32(match.Value) -1;
FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
var sortedColumns = fi.GetValue(bulkCopy);
var items = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);
FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
var metadata = itemdata.GetValue(items[index]);
var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
throw new DataFormatException(String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
}
throw;
}
এসকিউএল বাল্ককপি বিকল্পটি ব্যবহার করে ডেটাবেস টেবিলটিতে স্ট্রিং পাস করার সময় আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমি যে স্ট্রিংটি দিয়ে যাচ্ছিলাম তা 3 টি অক্ষরের ছিল যেখানে গন্তব্য কলামের দৈর্ঘ্য ছিল varchar(20)
। আমি স্ট্রিংয়ের Trim()
কোনও স্থান (শীর্ষস্থানীয় এবং অনুসরণযোগ্য) কারণে সমস্যাটি আছে কিনা তা পরীক্ষা করতে ফাংশনটি ব্যবহার করে ডিবিতে প্রবেশের আগে স্ট্রিংটি ছাঁটাই করার চেষ্টা করেছি । স্ট্রিংটি ছাঁটাই করার পরে, এটি দুর্দান্ত কাজ করেছে।
আপনি চেষ্টা করতে পারেন text.Trim()
আপনি যে সারণীতে বাল্ক সন্নিবেশ / অনুলিপি করছেন তাতে কলামগুলির আকার পরীক্ষা করুন। ভারচার বা অন্যান্য স্ট্রিং কলামগুলির প্রসারিত হওয়া বা আপনার সন্নিবেশ করা মানটি ট্রিম করা দরকার। কলাম ক্রমটিও টেবিলের মতো হওয়া উচিত।
উদাহরণস্বরূপ, বর্ণচক্রের আকার 30 থেকে 50 => পর্যন্ত বাড়ান
টেবিল পরিবর্তন করুন [ডিবিও] [[টেবিলের নাম] অ্যাল্টার কলাম [কলামনাম] ভারচার
কোডের দুর্দান্ত অংশ, ভাগ করে নেওয়ার জন্য ধন্যবাদ!
আমি কোনও ত্রুটিতে ক্লায়েন্টকে ফিরিয়ে দিতে প্রকৃত ডেটা মেম্বারনামকে পাওয়ার জন্য প্রতিবিম্বটি ব্যবহার করে শেষ করেছি (আমি একটি ডাব্লুসিএফ পরিষেবাতে বাল্ক সেভ ব্যবহার করছি)। আশা করি আমি কীভাবে এটি দরকারী তা অন্য কেউ খুঁজে পাবেন।
static string GetDataMemberName(string colName, object t) {
foreach(PropertyInfo propertyInfo in t.GetType().GetProperties()) {
if (propertyInfo.CanRead) {
if (propertyInfo.Name == colName) {
var attributes = propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault() as DataMemberAttribute;
if (attributes != null && !string.IsNullOrEmpty(attributes.Name))
return attributes.Name;
return colName;
}
}
}
return colName;
}
আমি এই ত্রুটি বার্তাটি পেয়েছি আরও সাম্প্রতিক এক সিসিস সংস্করণ (বনাম 2015 এন্টারপ্রাইজ, আমি মনে করি এটি সিসিস 2016)। আমি এখানে মন্তব্য করব কারণ আপনি এই ত্রুটি বার্তাটি গুগল করার সময় এটিই প্রথম রেফারেন্স আসে। আমি মনে করি উত্স অক্ষরের আকার লক্ষ্য অক্ষরের আকারের চেয়ে বড় হলে এটি বেশিরভাগ অক্ষর কলামগুলির সাথেই ঘটে। আমি এই বার্তাটি পেয়েছি যখন আমি একটি টেরাদাতা ডেটাবেস থেকে এমএস এসকিউএলতে একটি অ্যাডো নেট র ইনপুট ব্যবহার করছিলাম। মজার কারণ পূর্ববর্তী ওলেডব এমএস এসকিউএল-তে লিখেছেন কোনও কোডিং ওভাররাইড না করে সমস্ত চরিত্র রূপান্তরকে পুরোপুরি পরিচালনা করেছেন led কলিড নম্বর এবং সংশ্লিষ্ট গন্তব্য ইনপুট কলাম # আপনি মাঝে মাঝে কোলিড বার্তাটি পেয়ে যাচ্ছেন তা মূল্যহীন। আপনি যখন ম্যাপিংয়ের উপর থেকে বা এরকম কিছু থেকে শীর্ষে গণনা করেন এটি কলাম নয়। আমি মাইক্রোসফ্ট হলে, আমি ' d একটি ত্রুটি বার্তা দিতে বিব্রত বোধ করবেন যা দেখে মনে হচ্ছে এটি সমস্যাটি কলামের দিকে ইঙ্গিত করছে না যখন। আমি একটি শিক্ষিত অনুমান করে এবং তারপরে ম্যাপিংয়ে ইনপুটটিকে "উপেক্ষা করুন" এবং তারপরে পুনরায় পুনরায় চালু করে দেখুন এবং বার্তাটি চলে গেছে কিনা তা দিয়ে সমস্যার কলিড পেয়েছি। আমার ক্ষেত্রে এবং আমার পরিবেশে আমি এটি সাবস্ট্রাস্টারের মাধ্যমে নির্ধারণ করেছি ('টেরাদাতা ইনপুটটি আউটপুট কলামের জন্য এমএস এসকিউএল ঘোষণার অক্ষরের আকারের সাথে যুক্ত করুন Check পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার ইনপুট সাবটারটি আপনার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংয়ের মাধ্যমে প্রচার করে my আমার যদি এটি না ঘটে এবং আমাকে আমার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংস মুছে ফেলতে হয়েছিল এবং আবার শুরু করতে হয়েছিল Again আবার মজার বিষয় হ'ল ওএইলডিবি কেবল এটি পরিচালনা করেছিল এবং এডো.নেট ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কার্যকর করার জন্য এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। সাধারণভাবে আপনি যখন আপনার টার্গেট এমএস এসকিউএল হয় তখন OLEDB ব্যবহার করা উচিত। সমস্যাটি কলামের দিকে ইঙ্গিত করছে যখন এটি নয়। আমি একটি শিক্ষিত অনুমান করে এবং তারপরে ম্যাপিংয়ে ইনপুটটিকে "উপেক্ষা করুন" এবং তারপরে পুনরায় পুনরায় চালু করে দেখুন এবং বার্তাটি চলে গেছে কিনা তা দিয়ে সমস্যার কোলিড পেয়েছি। আমার ক্ষেত্রে এবং আমার পরিবেশে আমি এটি সাবস্ট্রাস্টারের মাধ্যমে নির্ধারণ করেছি ('টেরাদাতা ইনপুটটি আউটপুট কলামের জন্য এমএস এসকিউএল ঘোষণার অক্ষরের আকারের সাথে যুক্ত করুন Check পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার ইনপুট সাবটারটি আপনার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংয়ের মাধ্যমে প্রচার করে my আমার যদি এটি না ঘটে এবং আমাকে আমার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংস মুছে ফেলতে হয়েছিল এবং আবার শুরু করতে হয়েছিল Again আবার মজার বিষয় হ'ল ওএইলডিবি কেবল এটি পরিচালনা করেছিল এবং এডো.নেট ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কার্যকর করার জন্য এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। সাধারণভাবে আপনি যখন আপনার টার্গেট এমএস এসকিউএল হয় তখন OLEDB ব্যবহার করা উচিত। সমস্যাটি কলামের দিকে ইঙ্গিত করছে যখন এটি নয়। আমি একটি শিক্ষিত অনুমান করে এবং তারপরে ম্যাপিংয়ে ইনপুটটিকে "উপেক্ষা করুন" এবং তারপরে পুনরায় পুনরায় চালু করে দেখুন এবং বার্তাটি চলে গেছে কিনা তা দিয়ে সমস্যার কোলিড পেয়েছি। আমার ক্ষেত্রে এবং আমার পরিবেশে আমি এটি সাবস্ট্রাস্টারের মাধ্যমে নির্ধারণ করেছি ('টেরাদাতা ইনপুটটি আউটপুট কলামের জন্য এমএস এসকিউএল ঘোষণার অক্ষরের আকারের সাথে যুক্ত করুন Check পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার ইনপুট সাবটারটি আপনার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংয়ের মাধ্যমে প্রচার করে my আমার যদি এটি না ঘটে এবং আমাকে আমার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংস মুছে ফেলতে হয়েছিল এবং আবার শুরু করতে হয়েছিল Again আবার মজার বিষয় হ'ল ওএইলডিবি কেবল এটি পরিচালনা করেছিল এবং এডো.নেট ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কার্যকর করার জন্য এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। সাধারণভাবে আপনি যখন আপনার টার্গেট এমএস এসকিউএল হয় তখন OLEDB ব্যবহার করা উচিত। আমি একটি শিক্ষিত অনুমান করে এবং তারপরে ম্যাপিংয়ে ইনপুটটিকে "উপেক্ষা করুন" এবং তারপরে পুনরায় পুনরায় চালু করে দেখুন এবং বার্তাটি চলে গেছে কিনা তা দিয়ে সমস্যার কোলিড পেয়েছি। আমার ক্ষেত্রে এবং আমার পরিবেশে আমি এটি সাবস্ট্রাস্টারের মাধ্যমে নির্ধারণ করেছি ('টেরাদাতা ইনপুটটি আউটপুট কলামের জন্য এমএস এসকিউএল ঘোষণার অক্ষরের আকারের সাথে যুক্ত করুন Check পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার ইনপুট সাবটারটি আপনার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংয়ের মাধ্যমে প্রচার করে my আমার যদি এটি না ঘটে এবং আমাকে আমার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংস মুছে ফেলতে হয়েছিল এবং আবার শুরু করতে হয়েছিল Again আবার মজার বিষয় হ'ল ওএইলডিবি কেবল এটি পরিচালনা করেছিল এবং এডো.নেট ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কার্যকর করার জন্য এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। সাধারণভাবে আপনি যখন আপনার টার্গেট এমএস এসকিউএল হয় তখন OLEDB ব্যবহার করা উচিত। আমি একটি শিক্ষিত অনুমান করে এবং তারপরে ম্যাপিংয়ে ইনপুটটিকে "উপেক্ষা করুন" এবং তারপরে পুনরায় পুনরায় চালু করে দেখুন এবং বার্তাটি চলে গেছে কিনা তা দিয়ে সমস্যার কোলিড পেয়েছি। আমার ক্ষেত্রে এবং আমার পরিবেশে আমি এটি সাবস্ট্রাস্টারের মাধ্যমে নির্ধারণ করেছি ('টেরাদাতা ইনপুটটি আউটপুট কলামের জন্য এমএস এসকিউএল ঘোষণার অক্ষরের আকারের সাথে যুক্ত করুন Check পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার ইনপুট সাবটারটি আপনার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংয়ের মাধ্যমে প্রচার করে my আমার যদি এটি না ঘটে এবং আমাকে আমার সমস্ত ডেটা রূপান্তর এবং ম্যাপিংস মুছে ফেলতে হয়েছিল এবং আবার শুরু করতে হয়েছিল Again আবার মজার বিষয় হ'ল ওএইলডিবি কেবল এটি পরিচালনা করেছিল এবং এডো.নেট ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কার্যকর করার জন্য এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। সাধারণভাবে আপনি যখন আপনার টার্গেট এমএস এসকিউএল হয় তখন OLEDB ব্যবহার করা উচিত। গুলি এবং ম্যাপিংস এবং আবার শুরু করুন। আবার মজার বিষয় যে ওএইএলডিবি সবেমাত্র এটি পরিচালনা করেছিল এবং ADO.net ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কাজ করতে এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। আপনার লক্ষ্য এমএস এসকিউএল হলে সাধারণত আপনার ওএইএলডিবি ব্যবহার করা উচিত। গুলি এবং ম্যাপিংস এবং আবার শুরু করুন। আবার মজার বিষয় যে ওএইএলডিবি সবেমাত্র এটি পরিচালনা করেছিল এবং ADO.net ত্রুটিটি ছুঁড়ে ফেলেছিল এবং এটি কাজ করতে এই সমস্ত হস্তক্ষেপ থাকতে হয়েছিল। আপনার লক্ষ্য এমএস এসকিউএল হলে সাধারণত আপনার ওএইএলডিবি ব্যবহার করা উচিত।
আমি কেবল এতে হোঁচট খেয়েছি এবং @ বি_স্টিলের স্নিপেট ব্যবহার করে আমি অপরাধীর কলামটি আঁকতে সক্ষম হয়েছি। এবং আরও তদন্তের সময়, আমি বুঝতে পেরেছিলাম যে @ লিজি চন্দ্রাণের পরামর্শ মতো ঠিক মতো কলামটিও ছাঁটাই করা দরকার তবে আমি আইসেক্সেলডাটা রিডার ব্যবহার করছি এবং আমার 160 টি কলামকে বৈধতা ও ছাঁটাই করার কোনও সহজ উপায় আমি খুঁজে বের করতে পারি না।
তারপরে আমি CSVReader থেকে এই শ্রেণি, ( ভ্যালিডিংডাটাডিডার ) শ্রেণিতে হোঁচট খেয়েছি ।
এই শ্রেণীর সম্পর্কে আকর্ষণীয় বিষয় হ'ল এটি আপনাকে উত্স এবং গন্তব্য কলামগুলির ডেটা দৈর্ঘ্য, অপরাধীর সারি এবং এমনকী কলামের মান দেয় যা ত্রুটির সৃষ্টি করে।
আমি যা করেছি তা হ'ল সমস্ত (এনভারচর, বর্ণচর, চর এবং এনচার) কলামগুলি ছাঁটাই করে।
আমি কেবল আমার GetValue
পদ্ধতিটি এখানে পরিবর্তন করেছি :
object IDataRecord.GetValue(int i)
{
object columnValue = reader.GetValue(i);
if (i > -1 && i < lookup.Length)
{
DataRow columnDef = lookup[i];
if
(
(
(string)columnDef["DataTypeName"] == "varchar" ||
(string)columnDef["DataTypeName"] == "nvarchar" ||
(string)columnDef["DataTypeName"] == "char" ||
(string)columnDef["DataTypeName"] == "nchar"
) &&
(
columnValue != null &&
columnValue != DBNull.Value
)
)
{
string stringValue = columnValue.ToString().Trim();
columnValue = stringValue;
if (stringValue.Length > (int)columnDef["ColumnSize"])
{
string message =
"Column value \"" + stringValue.Replace("\"", "\\\"") + "\"" +
" with length " + stringValue.Length.ToString("###,##0") +
" from source column " + (this as IDataRecord).GetName(i) +
" in record " + currentRecord.ToString("###,##0") +
" does not fit in destination column " + columnDef["ColumnName"] +
" with length " + ((int)columnDef["ColumnSize"]).ToString("###,##0") +
" in table " + tableName +
" in database " + databaseName +
" on server " + serverName + ".";
if (ColumnException == null)
{
throw new Exception(message);
}
else
{
ColumnExceptionEventArgs args = new ColumnExceptionEventArgs();
args.DataTypeName = (string)columnDef["DataTypeName"];
args.DataType = Type.GetType((string)columnDef["DataType"]);
args.Value = columnValue;
args.SourceIndex = i;
args.SourceColumn = reader.GetName(i);
args.DestIndex = (int)columnDef["ColumnOrdinal"];
args.DestColumn = (string)columnDef["ColumnName"];
args.ColumnSize = (int)columnDef["ColumnSize"];
args.RecordIndex = currentRecord;
args.TableName = tableName;
args.DatabaseName = databaseName;
args.ServerName = serverName;
args.Message = message;
ColumnException(args);
columnValue = args.Value;
}
}
}
}
return columnValue;
}
আশা করি এটি কাউকে সাহায্য করবে