MsSql.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:21k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. using System;
  17. using System.Collections.Generic;
  18. using System.Collections.ObjectModel;
  19. using System.Text;
  20. using System.Data.SqlClient;
  21. using System.Data;
  22. using SharpMap.Data;
  23. using SharpMap.Data.Providers;
  24. using SharpMap.Converters.WellKnownBinary;
  25. namespace SharpMap.Data.Providers
  26. {
  27. /// <summary>
  28. /// Microsoft SQL data provider
  29. /// </summary>
  30. /// <remarks>
  31. /// <para>
  32. /// The SQL data table MUST contain five data columns: A binary or image column (a Geometry Column) for storing WKB formatted geometries, 
  33. /// and four real values holding the boundingbox of the geometry. These must be named: Envelope_MinX, Envelope_MinY, Envelope_MaxX and Envelope_MaxY.
  34. /// Any extra columns will be returns as feature data.
  35. /// </para>
  36. /// <para>For creating a valid MS SQL datatable for SharpMap, see <see cref="CreateDataTable"/> 
  37. /// for creating and uploading a datasource to MS SQL Server.</para>
  38. /// <example>
  39. /// Adding a datasource to a layer:
  40. /// <code lang="C#">
  41. /// SharpMap.Layers.VectorLayer myLayer = new SharpMap.Layers.VectorLayer("My layer");
  42. /// string ConnStr = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|GeoDatabase.mdf;Integrated Security=True;User Instance=True";
  43. /// myLayer.DataSource = new SharpMap.Data.Providers.MsSql(ConnStr, "myTable");
  44. /// </code>
  45. /// </example>
  46. /// </remarks>
  47. [Serializable]
  48. public class MsSql : IProvider, IDisposable
  49. {
  50. /// <summary>
  51. /// Initializes a new connection to MS Sql Server
  52. /// </summary>
  53. /// <param name="ConnectionStr">Connectionstring</param>
  54. /// <param name="tablename">Name of data table</param>
  55. /// <param name="geometryColumnName">Name of geometry column</param>
  56. /// /// <param name="OID_ColumnName">Name of column with unique identifier</param>
  57. public MsSql(string ConnectionStr, string tablename, string geometryColumnName, string OID_ColumnName)
  58. {
  59. this.ConnectionString = ConnectionStr;
  60. this.Table = tablename;
  61. this.GeometryColumn = geometryColumnName; //Name of column to store geometry
  62. this.ObjectIdColumn = OID_ColumnName; //Name of object ID column
  63. }
  64. private bool _IsOpen;
  65. /// <summary>
  66. /// Returns true if the datasource is currently open
  67. /// </summary>
  68. public bool IsOpen
  69. {
  70. get { return _IsOpen; }
  71. }
  72. /// <summary>
  73. /// Opens the datasource
  74. /// </summary>
  75. public void Open()
  76. {
  77. //Don't really do anything. mssql's ConnectionPooling takes over here
  78. _IsOpen = true;
  79. }
  80. /// <summary>
  81. /// Closes the datasource
  82. /// </summary>
  83. public void Close()
  84. {
  85. //Don't really do anything. mssql's ConnectionPooling takes over here
  86. _IsOpen = false;
  87. }
  88. #region Disposers and finalizers
  89. private bool disposed = false;
  90. /// <summary>
  91. /// Disposes the object
  92. /// </summary>
  93. public void Dispose()
  94. {
  95. Dispose(true);
  96. GC.SuppressFinalize(this);
  97. }
  98. internal void Dispose(bool disposing)
  99. {
  100. if (!disposed)
  101. {
  102. if (disposing)
  103. {
  104. //Close();
  105. }
  106. disposed = true;
  107. }
  108. }
  109. /// <summary>
  110. /// Finalizer
  111. /// </summary>
  112. ~MsSql()
  113. {
  114. Dispose();
  115. }
  116. #endregion
  117. private string _ConnectionString;
  118. /// <summary>
  119. /// Connectionstring
  120. /// </summary>
  121. public string ConnectionString
  122. {
  123. get { return _ConnectionString; }
  124. set { _ConnectionString = value; }
  125. }
  126. private string _Table;
  127. /// <summary>
  128. /// Data table name
  129. /// </summary>
  130. public string Table
  131. {
  132. get { return _Table; }
  133. set { _Table = value; }
  134. }
  135. private string _GeometryColumn;
  136. /// <summary>
  137. /// Name of geometry column
  138. /// </summary>
  139. public string GeometryColumn
  140. {
  141. get { return _GeometryColumn; }
  142. set { _GeometryColumn = value; }
  143. }
  144. private string _ObjectIdColumn;
  145. /// <summary>
  146. /// Name of column that contains the Object ID
  147. /// </summary>
  148. public string ObjectIdColumn
  149. {
  150. get { return _ObjectIdColumn; }
  151. set { _ObjectIdColumn = value; }
  152. }
  153. /// <summary>
  154. /// Returns geometries within the specified bounding box
  155. /// </summary>
  156. /// <param name="bbox"></param>
  157. /// <returns></returns>
  158. public Collection<Geometries.Geometry> GetGeometriesInView(SharpMap.Geometries.BoundingBox bbox)
  159. {
  160. Collection<Geometries.Geometry> features = new Collection<SharpMap.Geometries.Geometry>();
  161. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  162. {
  163. string BoxIntersect = GetBoxClause(bbox);
  164. string strSQL = "SELECT " + this.GeometryColumn + " AS Geom ";
  165. strSQL += "FROM " + this.Table + " WHERE ";
  166. strSQL += BoxIntersect;
  167. if (!String.IsNullOrEmpty(_defintionQuery))
  168. strSQL += " AND " + this.DefinitionQuery;
  169. using (SqlCommand command = new SqlCommand(strSQL, conn))
  170. {
  171. conn.Open();
  172. using (SqlDataReader dr = command.ExecuteReader())
  173. {
  174. while (dr.Read())
  175. {
  176. if (dr[0] != DBNull.Value)
  177. {
  178. SharpMap.Geometries.Geometry geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);
  179. if (geom != null)
  180. features.Add(geom);
  181. }
  182. }
  183. }
  184. conn.Close();
  185. }
  186. }
  187. return features;
  188. }
  189. /// <summary>
  190. /// Returns the geometry corresponding to the Object ID
  191. /// </summary>
  192. /// <param name="oid">Object ID</param>
  193. /// <returns>geometry</returns>
  194. public SharpMap.Geometries.Geometry GetGeometryByID(uint oid)
  195. {
  196. SharpMap.Geometries.Geometry geom = null;
  197. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  198. {
  199. string strSQL = "SELECT " + this.GeometryColumn + " AS Geom FROM " + this.Table + " WHERE " + this.ObjectIdColumn + "='" + oid.ToString() + "'";
  200. conn.Open();
  201. using (SqlCommand command = new SqlCommand(strSQL, conn))
  202. {
  203. using (SqlDataReader dr = command.ExecuteReader())
  204. {
  205. while (dr.Read())
  206. {
  207. if (dr[0] != DBNull.Value)
  208. geom = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr[0]);
  209. }
  210. }
  211. }
  212. conn.Close();
  213. }
  214. return geom;
  215. }
  216. /// <summary>
  217. /// Returns geometry Object IDs whose bounding box intersects 'bbox'
  218. /// </summary>
  219. /// <param name="bbox"></param>
  220. /// <returns></returns>
  221. public Collection<uint> GetObjectIDsInView(SharpMap.Geometries.BoundingBox bbox)
  222. {
  223. Collection<uint> objectlist = new Collection<uint>();
  224. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  225. {
  226. string strSQL = "SELECT " + this.ObjectIdColumn + " ";
  227. strSQL += "FROM " + this.Table + " WHERE ";
  228. strSQL += GetBoxClause(bbox);
  229. if (!String.IsNullOrEmpty(_defintionQuery))
  230. strSQL += " AND " + this.DefinitionQuery + " AND ";
  231. using (SqlCommand command = new SqlCommand(strSQL, conn))
  232. {
  233. conn.Open();
  234. using (SqlDataReader dr = command.ExecuteReader())
  235. {
  236. while (dr.Read())
  237. {
  238. if (dr[0] != DBNull.Value)
  239. {
  240. uint ID = (uint)(int)dr[0];
  241. objectlist.Add(ID);
  242. }
  243. }
  244. }
  245. conn.Close();
  246. }
  247. }
  248. return objectlist;
  249. }
  250. /// <summary>
  251. /// Returns the features that intersects with 'geom' [NOT IMPLEMENTED]
  252. /// </summary>
  253. /// <param name="geom"></param>
  254. /// <param name="ds">FeatureDataSet to fill data into</param>
  255. public void ExecuteIntersectionQuery(SharpMap.Geometries.Geometry geom, FeatureDataSet ds)
  256. {
  257. throw new NotImplementedException();
  258. }
  259. /// <summary>
  260. /// Returns the number of features in the dataset
  261. /// </summary>
  262. /// <returns>number of features</returns>
  263. public int GetFeatureCount()
  264. {
  265. int count = 0;
  266. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  267. {
  268. string strSQL = "SELECT COUNT(*) FROM " + this.Table;
  269. if (!String.IsNullOrEmpty(_defintionQuery))
  270. strSQL += " WHERE " + this.DefinitionQuery;
  271. using (SqlCommand command = new SqlCommand(strSQL, conn))
  272. {
  273. conn.Open();
  274. count = (int)command.ExecuteScalar();
  275. conn.Close();
  276. }
  277. }
  278. return count;
  279. }
  280. private string _defintionQuery;
  281. /// <summary>
  282. /// Definition query used for limiting dataset
  283. /// </summary>
  284. public string DefinitionQuery
  285. {
  286. get { return _defintionQuery; }
  287. set { _defintionQuery = value; }
  288. }
  289. #region IProvider Members
  290. /// <summary>
  291. /// Gets a collection of columns in the dataset
  292. /// </summary>
  293. public System.Data.DataColumnCollection Columns
  294. {
  295. get
  296. {
  297. throw new NotImplementedException();
  298. }
  299. }
  300. private int _srid = -2;
  301. /// <summary>
  302. /// Spacial Reference ID
  303. /// </summary>
  304. public int SRID
  305. {
  306. get { return _srid; }
  307. set { _srid = value; }
  308. }
  309. /// <summary>
  310. /// Returns a datarow based on a RowID
  311. /// </summary>
  312. /// <param name="RowID"></param>
  313. /// <returns>datarow</returns>
  314. public SharpMap.Data.FeatureDataRow GetFeature(uint RowID)
  315. {
  316. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  317. {
  318. string strSQL = "SELECT *, " + this.GeometryColumn + " AS sharpmap_tempgeometry FROM " + this.Table + " WHERE " + this.ObjectIdColumn + "='" + RowID.ToString() + "'";
  319. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, conn))
  320. {
  321. DataSet ds = new DataSet();
  322. conn.Open();
  323. adapter.Fill(ds);
  324. conn.Close();
  325. if (ds.Tables.Count > 0)
  326. {
  327. FeatureDataTable fdt = new FeatureDataTable(ds.Tables[0]);
  328. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  329. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry" && !col.ColumnName.StartsWith("Envelope_"))
  330. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  331. if (ds.Tables[0].Rows.Count > 0)
  332. {
  333. System.Data.DataRow dr = ds.Tables[0].Rows[0];
  334. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  335. foreach (System.Data.DataColumn col in ds.Tables[0].Columns)
  336. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry" && !col.ColumnName.StartsWith("Envelope_"))
  337. fdr[col.ColumnName] = dr[col];
  338. if(dr["sharpmap_tempgeometry"] != DBNull.Value)
  339. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  340. return fdr;
  341. }
  342. else
  343. return null;
  344. }
  345. else
  346. return null;
  347. }
  348. }
  349. }
  350. /// <summary>
  351. /// Boundingbox of dataset
  352. /// </summary>
  353. /// <returns>boundingbox</returns>
  354. public SharpMap.Geometries.BoundingBox GetExtents()
  355. {
  356. SharpMap.Geometries.BoundingBox box = null;
  357. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  358. {
  359. string strSQL = "SELECT Min(Envelope_MinX) AS MinX, Min(Envelope_MinY) AS MinY, Max(Envelope_MaxX) AS MaxX, Max(Envelope_MaxY) AS MaxY FROM " + this.Table;
  360. if (!String.IsNullOrEmpty(_defintionQuery))
  361. strSQL += " WHERE " + this.DefinitionQuery;
  362. using (SqlCommand command = new SqlCommand(strSQL, conn))
  363. {
  364. conn.Open();
  365. using (SqlDataReader dr = command.ExecuteReader())
  366. if (dr.Read())
  367. {
  368. box = new SharpMap.Geometries.BoundingBox((float)dr[0], (float)dr[1], (float)dr[2], (float)dr[3]);
  369. }
  370. conn.Close();
  371. }
  372. return box;
  373. }
  374. }
  375. /// <summary>
  376. /// Gets the connection ID of the datasource
  377. /// </summary>
  378. public string ConnectionID
  379. {
  380. get { return _ConnectionString; }
  381. }
  382. private string GetBoxClause(SharpMap.Geometries.BoundingBox bbox)
  383. {
  384. return String.Format(SharpMap.Map.numberFormat_EnUS,
  385. "(Envelope_MinX < {0} AND Envelope_MaxX > {1} AND Envelope_MinY < {2} AND Envelope_MaxY > {3})",
  386. bbox.Max.X, bbox.Min.X, bbox.Max.Y, bbox.Min.Y);
  387. }
  388. /// <summary>
  389. /// Returns all features with the view box
  390. /// </summary>
  391. /// <param name="bbox">view box</param>
  392. /// <param name="ds">FeatureDataSet to fill data into</param>
  393. public void ExecuteIntersectionQuery(SharpMap.Geometries.BoundingBox bbox, SharpMap.Data.FeatureDataSet ds)
  394. {
  395. //List<Geometries.Geometry> features = new List<SharpMap.Geometries.Geometry>();
  396. using (SqlConnection conn = new SqlConnection(_ConnectionString))
  397. {
  398. string strSQL = "SELECT *, " + this.GeometryColumn + " AS sharpmap_tempgeometry ";
  399. strSQL += "FROM " + this.Table + " WHERE ";
  400. strSQL += GetBoxClause(bbox);
  401. if (!String.IsNullOrEmpty(_defintionQuery))
  402. strSQL += " AND " + this.DefinitionQuery;
  403. using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, conn))
  404. {
  405. conn.Open();
  406. System.Data.DataSet ds2 = new System.Data.DataSet();
  407. adapter.Fill(ds2);
  408. conn.Close();
  409. if (ds2.Tables.Count > 0)
  410. {
  411. FeatureDataTable fdt = new FeatureDataTable(ds2.Tables[0]);
  412. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  413. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry" && !col.ColumnName.StartsWith("Envelope_"))
  414. fdt.Columns.Add(col.ColumnName, col.DataType, col.Expression);
  415. foreach (System.Data.DataRow dr in ds2.Tables[0].Rows)
  416. {
  417. SharpMap.Data.FeatureDataRow fdr = fdt.NewRow();
  418. foreach (System.Data.DataColumn col in ds2.Tables[0].Columns)
  419. if (col.ColumnName != this.GeometryColumn && col.ColumnName != "sharpmap_tempgeometry" && !col.ColumnName.StartsWith("Envelope_"))
  420. fdr[col.ColumnName] = dr[col];
  421. if (dr["sharpmap_tempgeometry"] != DBNull.Value)
  422. fdr.Geometry = SharpMap.Converters.WellKnownBinary.GeometryFromWKB.Parse((byte[])dr["sharpmap_tempgeometry"]);
  423. fdt.AddRow(fdr);
  424. }
  425. ds.Tables.Add(fdt);
  426. }
  427. }
  428. }
  429. }
  430. #endregion
  431. /// <summary>
  432. /// Creates a new table in a Microsoft SQL Server database and copies rows from an existing datasource.
  433. /// </summary>
  434. /// <remarks>
  435. /// <para>The datatable created will contain six extra columns besides the attribute data: "OID" (Object ID row), 
  436. /// "WKB_Geometry" (Geometry stored as WKB), and Envelope_MinX, Envelope_MinY, Envelope_MaxX, Envelope_MaxY
  437. /// for geometry bounding box.</para>
  438. /// <para>
  439. /// <example>
  440. /// Upload a ShapeFile to a database:
  441. /// <code>
  442. /// public void CreateDatabase(string shapeFile)
  443. /// {
  444. /// if (!System.IO.File.Exists(shapeFile))
  445. /// {
  446. /// MessageBox.Show("File not found");
  447. /// return;
  448. /// }
  449. /// ShapeFile shp = new ShapeFile(shapeFile, false);
  450. /// //Create tablename from filename
  451. /// string tablename = shapeFile.Substring(shapeFile.LastIndexOf('\') + 1,
  452. /// shapeFile.LastIndexOf('.') - shapeFile.LastIndexOf('\') - 1);
  453. /// //Create connectionstring
  454. /// string connstr = @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|GeoDatabase.mdf;Integrated Security=True;User Instance=True";
  455. /// int count = SharpMap.Data.Providers.MsSql.CreateDataTable(shp, tablename, connstr);
  456. /// MessageBox.Show("Uploaded " + count.ToString() + " features to datatable '" + tablename + "'");
  457. /// }
  458. /// </code>
  459. /// </example>
  460. /// </para>
  461. /// </remarks>
  462. /// <param name="datasource">Datasource to upload</param>
  463. /// <param name="tablename">Name of table to create (existing table will be overwritten!)</param>
  464. /// <param name="connstr">Connection string to database</param>
  465. /// <returns>Number or rows inserted, -1 if failed and 0 if table created but no rows inserted.</returns>
  466. public static int CreateDataTable(SharpMap.Data.Providers.IProvider datasource, string tablename, string connstr)
  467. {
  468. datasource.Open();
  469. FeatureDataRow geom = datasource.GetFeature(0);
  470. DataColumnCollection columns = geom.Table.Columns;
  471. int counter = -1;
  472. using (SqlConnection conn = new SqlConnection(connstr))
  473. {
  474. SqlCommand command = new SqlCommand();
  475. command.Connection = conn;
  476. conn.Open();
  477. //Try to drop table if it exists
  478. try
  479. {
  480. command.CommandText = "DROP TABLE "" + tablename + "";";
  481. command.ExecuteNonQuery();
  482. }
  483. catch { }
  484. //Create new table for storing the datasource
  485. string sql = "CREATE TABLE " + tablename + " (oid INTEGER IDENTITY PRIMARY KEY, WKB_Geometry Image, " +
  486. "Envelope_MinX real, Envelope_MinY real, Envelope_MaxX real, Envelope_MaxY real";
  487. foreach (DataColumn col in columns)
  488. if (col.DataType != typeof(String))
  489. sql += ", " + col.ColumnName + " " + Type2SqlType(col.DataType).ToString();
  490. else
  491. sql += ", " + col.ColumnName + " VARCHAR(256)";
  492. command.CommandText = sql + ");";
  493. command.ExecuteNonQuery();
  494. counter++;
  495. Collection<uint> indexes = datasource.GetObjectIDsInView(datasource.GetExtents());
  496. //Select all indexes in shapefile, loop through each feature and insert them one-by-one
  497. foreach (uint idx in indexes)
  498. {
  499. //Get feature from shapefile
  500. SharpMap.Data.FeatureDataRow feature = datasource.GetFeature(idx);
  501. if (counter == 0)
  502. {
  503. //Create insert script
  504. string strSQL = " (";
  505. foreach (DataColumn col in feature.Table.Columns)
  506. strSQL += "@" + col.ColumnName + ",";
  507. strSQL += "@WKB_Geometry,@Envelope_MinX,@Envelope_MinY, " +
  508. "@Envelope_MaxX,@Envelope_MaxY)";
  509. strSQL = "INSERT INTO " + tablename + strSQL.Replace("@", "") + " VALUES" + strSQL;
  510. command.CommandText = strSQL;
  511. command.Parameters.Clear();
  512. //Add datacolumn parameters
  513. foreach (DataColumn col in feature.Table.Columns)
  514. command.Parameters.Add("@" + col.ColumnName, Type2SqlType(col.DataType));
  515. //Add geometry parameters
  516. command.Parameters.Add("@WKB_Geometry", SqlDbType.VarBinary);
  517. command.Parameters.Add("@Envelope_MinX", SqlDbType.Real);
  518. command.Parameters.Add("@Envelope_MinY", SqlDbType.Real);
  519. command.Parameters.Add("@Envelope_MaxX", SqlDbType.Real);
  520. command.Parameters.Add("@Envelope_MaxY", SqlDbType.Real);
  521. }
  522. //Set values
  523. foreach (DataColumn col in feature.Table.Columns)
  524. command.Parameters["@" + col.ColumnName].Value = feature[col];
  525. if (feature.Geometry != null)
  526. {
  527. command.Parameters["@WKB_Geometry"].Value = feature.Geometry.AsBinary(); //Add the geometry as Well-Known Binary
  528. SharpMap.Geometries.BoundingBox box = feature.Geometry.GetBoundingBox();
  529. command.Parameters["@Envelope_MinX"].Value = box.Left;
  530. command.Parameters["@Envelope_MinY"].Value = box.Bottom;
  531. command.Parameters["@Envelope_MaxX"].Value = box.Right;
  532. command.Parameters["@Envelope_MaxY"].Value = box.Top;
  533. }
  534. else
  535. {
  536. command.Parameters["@WKB_Geometry"].Value = DBNull.Value;
  537. command.Parameters["@Envelope_MinX"].Value = DBNull.Value;
  538. command.Parameters["@Envelope_MinY"].Value = DBNull.Value;
  539. command.Parameters["@Envelope_MaxX"].Value = DBNull.Value;
  540. command.Parameters["@Envelope_MaxY"].Value = DBNull.Value;
  541. }
  542. //Insert row
  543. command.ExecuteNonQuery();
  544. counter++;
  545. }
  546. //Create indexes
  547. command.Parameters.Clear();
  548. command.CommandText = "CREATE INDEX [IDX_Envelope_MinX] ON " + tablename + " (Envelope_MinX)";
  549. command.ExecuteNonQuery();
  550. command.CommandText = "CREATE INDEX [IDX_Envelope_MinY] ON " + tablename + " (Envelope_MinY)";
  551. command.ExecuteNonQuery();
  552. command.CommandText = "CREATE INDEX [IDX_Envelope_MaxX] ON " + tablename + " (Envelope_MaxX)";
  553. command.ExecuteNonQuery();
  554. command.CommandText = "CREATE INDEX [IDX_Envelope_MaxY] ON " + tablename + " (Envelope_MaxY)";
  555. command.ExecuteNonQuery();
  556. conn.Close();
  557. }
  558. datasource.Close();
  559. return counter;
  560. }
  561. /// <summary>
  562. /// Returns the name of the SqlServer datatype based on a .NET datatype
  563. /// </summary>
  564. /// <param name="t"></param>
  565. /// <returns></returns>
  566. private static SqlDbType Type2SqlType(Type t)
  567. {
  568. switch (t.ToString())
  569. {
  570. case "System.Boolean": return System.Data.SqlDbType.Bit;
  571. case "System.Single": return System.Data.SqlDbType.Real;
  572. case "System.Double": return System.Data.SqlDbType.Float;
  573. case "System.Int16": return System.Data.SqlDbType.SmallInt;
  574. case "System.Int32": return System.Data.SqlDbType.Int;
  575. case "System.Int64": return System.Data.SqlDbType.BigInt;
  576. case "System.DateTime": return System.Data.SqlDbType.DateTime;
  577. case "System.Byte[]": return System.Data.SqlDbType.Image;
  578. case "System.String": return System.Data.SqlDbType.VarChar;
  579. default:
  580. throw (new NotSupportedException("Unsupported datatype '" + t.Name + "' found in datasource"));
  581. }
  582. }
  583. }
  584. }