⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbasereader.cs

📁 C# 的地图开发例子(sharp map)
💻 CS
📖 第 1 页 / 共 2 页
字号:
				case 0x23: return System.Text.Encoding.GetEncoding(852); // Polish OEM
				case 0x24: return System.Text.Encoding.GetEncoding(860); // Portuguese OEM
				case 0x25: return System.Text.Encoding.GetEncoding(850); // Portuguese OEM secondary codepage
				case 0x26: return System.Text.Encoding.GetEncoding(866); // Russian OEM
				case 0x37: return System.Text.Encoding.GetEncoding(850); // English OEM (U.S.) secondary codepage
				case 0x40: return System.Text.Encoding.GetEncoding(852); // Romanian OEM
				case 0x4D: return System.Text.Encoding.GetEncoding(936); // Chinese GBK (PRC)
				case 0x4E: return System.Text.Encoding.GetEncoding(949); // Korean (ANSI/OEM)
				case 0x4F: return System.Text.Encoding.GetEncoding(950); // Chinese Big5 (Taiwan)
				case 0x50: return System.Text.Encoding.GetEncoding(874); // Thai (ANSI/OEM)
				case 0x57: return System.Text.Encoding.GetEncoding(1252); // ANSI
				case 0x58: return System.Text.Encoding.GetEncoding(1252); // Western European ANSI
				case 0x59: return System.Text.Encoding.GetEncoding(1252); // Spanish ANSI
				case 0x64: return System.Text.Encoding.GetEncoding(852); // Eastern European MS朌OS
				case 0x65: return System.Text.Encoding.GetEncoding(866); // Russian MS朌OS
				case 0x66: return System.Text.Encoding.GetEncoding(865); // Nordic MS朌OS
				case 0x67: return System.Text.Encoding.GetEncoding(861); // Icelandic MS朌OS
				case 0x68: return System.Text.Encoding.GetEncoding(895); // Kamenicky (Czech) MS-DOS 
				case 0x69: return System.Text.Encoding.GetEncoding(620); // Mazovia (Polish) MS-DOS 
				case 0x6A: return System.Text.Encoding.GetEncoding(737); // Greek MS朌OS (437G)
				case 0x6B: return System.Text.Encoding.GetEncoding(857); // Turkish MS朌OS
				case 0x6C: return System.Text.Encoding.GetEncoding(863); // French朇anadian MS朌OS
				case 0x78: return System.Text.Encoding.GetEncoding(950); // Taiwan Big 5
				case 0x79: return System.Text.Encoding.GetEncoding(949); // Hangul (Wansung)
				case 0x7A: return System.Text.Encoding.GetEncoding(936); // PRC GBK
				case 0x7B: return System.Text.Encoding.GetEncoding(932); // Japanese Shift-JIS
				case 0x7C: return System.Text.Encoding.GetEncoding(874); // Thai Windows/MS朌OS
				case 0x7D: return System.Text.Encoding.GetEncoding(1255); // Hebrew Windows 
				case 0x7E: return System.Text.Encoding.GetEncoding(1256); // Arabic Windows 
				case 0x86: return System.Text.Encoding.GetEncoding(737); // Greek OEM
				case 0x87: return System.Text.Encoding.GetEncoding(852); // Slovenian OEM
				case 0x88: return System.Text.Encoding.GetEncoding(857); // Turkish OEM
				case 0x96: return System.Text.Encoding.GetEncoding(10007); // Russian Macintosh 
				case 0x97: return System.Text.Encoding.GetEncoding(10029); // Eastern European Macintosh 
				case 0x98: return System.Text.Encoding.GetEncoding(10006); // Greek Macintosh 
				case 0xC8: return System.Text.Encoding.GetEncoding(1250); // Eastern European Windows
				case 0xC9: return System.Text.Encoding.GetEncoding(1251); // Russian Windows
				case 0xCA: return System.Text.Encoding.GetEncoding(1254); // Turkish Windows
				case 0xCB: return System.Text.Encoding.GetEncoding(1253); // Greek Windows
				case 0xCC: return System.Text.Encoding.GetEncoding(1257); // Baltic Windows
				default:
					return System.Text.Encoding.UTF7;
			}

		}

		/// <summary>
		/// Returns a DataTable that describes the column metadata of the DBase file.
		/// </summary>
		/// <returns>A DataTable that describes the column metadata.</returns>
		public DataTable GetSchemaTable()
		{
			DataTable tab = new DataTable();
			// all of common, non "base-table" fields implemented
			tab.Columns.Add("ColumnName", typeof(System.String));
			tab.Columns.Add("ColumnSize", typeof(Int32));
			tab.Columns.Add("ColumnOrdinal", typeof(Int32));
			tab.Columns.Add("NumericPrecision", typeof(Int16));
			tab.Columns.Add("NumericScale", typeof(Int16));
			tab.Columns.Add("DataType", typeof(System.Type));
			tab.Columns.Add("AllowDBNull", typeof(bool));
			tab.Columns.Add("IsReadOnly", typeof(bool));
			tab.Columns.Add("IsUnique", typeof(bool));
			tab.Columns.Add("IsRowVersion", typeof(bool));
			tab.Columns.Add("IsKey", typeof(bool));
			tab.Columns.Add("IsAutoIncrement", typeof(bool));
			tab.Columns.Add("IsLong", typeof(bool));

			foreach (DbaseField dbf in DbaseColumns)
				tab.Columns.Add(dbf.ColumnName, dbf.DataType);

			for (int i = 0; i < DbaseColumns.Length; i++)
			{
				DataRow r = tab.NewRow();
				r["ColumnName"] = DbaseColumns[i].ColumnName;
				r["ColumnSize"] = DbaseColumns[i].Length;
				r["ColumnOrdinal"] = i;
				r["NumericPrecision"] = DbaseColumns[i].Decimals;
				r["NumericScale"] = 0;
				r["DataType"] = DbaseColumns[i].DataType;
				r["AllowDBNull"] = true;
				r["IsReadOnly"] = true;
				r["IsUnique"] = false;
				r["IsRowVersion"] = false;
				r["IsKey"] = false;
				r["IsAutoIncrement"] = false;
				r["IsLong"] = false;

				// specializations, if ID is unique
				//if (_ColumnNames[i] == "ID")
				//	r["IsUnique"] = true;

				tab.Rows.Add(r);
			}
			
			return tab;
		}


		private SharpMap.Data.FeatureDataTable baseTable;

		private void CreateBaseTable()
		{
			baseTable = new SharpMap.Data.FeatureDataTable();
			foreach (DbaseField dbf in DbaseColumns)
				baseTable.Columns.Add(dbf.ColumnName, dbf.DataType);
		}
		
		internal SharpMap.Data.FeatureDataTable NewTable
		{
			get { return baseTable.Clone(); }
		}

		internal object GetValue(uint oid, int colid)
		{
			if (!_isOpen)
				throw (new ApplicationException("An attempt was made to read from a closed DBF file"));
			if (oid >= _NumberOfRecords)
				throw (new ArgumentException("Invalid DataRow requested at index " + oid.ToString()));
			if (colid >= DbaseColumns.Length || colid < 0)
				throw ((new ArgumentException("Column index out of range")));

			fs.Seek(_HeaderLength + oid * _RecordLength, 0);
			for (int i = 0; i < colid; i++)
				br.BaseStream.Seek(DbaseColumns[i].Length,SeekOrigin.Current);

			return ReadDbfValue(DbaseColumns[colid]);
		}

		private System.Text.Encoding _Encoding;
		private System.Text.Encoding _FileEncoding;

		/// <summary>
		/// Gets or sets the <see cref="System.Text.Encoding"/> used for parsing strings from the DBase DBF file.
		/// </summary>
		/// <remarks>
		/// If the encoding type isn't set, the dbase driver will try to determine the correct <see cref="System.Text.Encoding"/>.
		/// </remarks>
		public System.Text.Encoding Encoding
		{
			get { return _Encoding; }
			set { _Encoding = value; }
		}
	

		/// <summary>
		/// Gets the feature at the specified Object ID
		/// </summary>
		/// <param name="oid"></param>
		/// <param name="table"></param>
		/// <returns></returns>
		internal SharpMap.Data.FeatureDataRow GetFeature(uint oid, SharpMap.Data.FeatureDataTable table)
		{
			if (!_isOpen)
				throw (new ApplicationException("An attempt was made to read from a closed DBF file"));
			if (oid >= _NumberOfRecords)
				throw (new ArgumentException("Invalid DataRow requested at index " + oid.ToString()));
			fs.Seek(_HeaderLength + oid * _RecordLength,0);

			SharpMap.Data.FeatureDataRow dr = table.NewRow();

			if (br.ReadChar() == '*') //is record marked deleted?
				return null;

			for (int i = 0; i < DbaseColumns.Length;i++ )
			{
				DbaseField dbf = DbaseColumns[i];
				dr[dbf.ColumnName] = ReadDbfValue(dbf);
			}
			return dr;
		}

		private object ReadDbfValue(DbaseField dbf)
		{
			switch (dbf.DataType.ToString())
			{
				case "System.String":
					if(_Encoding==null)
						return _FileEncoding.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
					else
						return _Encoding.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
				case "System.Double":
					string temp = System.Text.Encoding.UTF7.GetString(br.ReadBytes(dbf.Length)).Replace("\0", "").Trim();
					double dbl = 0;
					if(double.TryParse(temp, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out dbl))
						return dbl;
					else
						return DBNull.Value;
				case "System.Int16":
					string temp16 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
					Int16 i16 = 0;
					if (Int16.TryParse(temp16, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i16))
						return i16;
					else
						return DBNull.Value;
				case "System.Int32":
					string temp32 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
					Int32 i32 = 0;
					if (Int32.TryParse(temp32, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i32))
						return i32;
					else
						return DBNull.Value;
				case "System.Int64":
					string temp64 = System.Text.Encoding.UTF7.GetString((br.ReadBytes(dbf.Length))).Replace("\0", "").Trim();
					Int64 i64 = 0;
					if (Int64.TryParse(temp64, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out i64))
						return i64;
					else
						return DBNull.Value;
				case "System.Single":
					string temp4 = System.Text.Encoding.UTF8.GetString((br.ReadBytes(dbf.Length)));
					float f = 0;
					if (float.TryParse(temp4, System.Globalization.NumberStyles.Float, SharpMap.Map.numberFormat_EnUS, out f))
						return f;
					else
						return DBNull.Value;
				case "System.Boolean":
					char tempChar = br.ReadChar();
					return ((tempChar == 'T') || (tempChar == 't') || (tempChar == 'Y') || (tempChar == 'y'));
				case "System.DateTime":
					DateTime date;
					// Mono has not yet implemented DateTime.TryParseExact
					#if !MONO
					if (DateTime.TryParseExact(System.Text.Encoding.UTF7.GetString((br.ReadBytes(8))),
						"yyyyMMdd", SharpMap.Map.numberFormat_EnUS, System.Globalization.DateTimeStyles.None, out date))	
						return date;
					else
						return DBNull.Value;
					#else
					try 
					{
						return date = DateTime.ParseExact ( System.Text.Encoding.UTF7.GetString((br.ReadBytes(8))), 	
						"yyyyMMdd", SharpMap.Map.numberFormat_EnUS, System.Globalization.DateTimeStyles.None );
					}
					catch ( Exception e )
					{
						return DBNull.Value;
					}
					#endif
				default:
					throw (new NotSupportedException("Cannot parse DBase field '" + dbf.ColumnName + "' of type '" + dbf.DataType.ToString() + "'"));
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -