简体   繁体   English

设置数据类型无法用于列-使用SMO创建SQL DB

[英]Set DataType failed for Column- SQL DB creation with SMO

i am trying to create a DB with C# WinForm Application using SMO. 我正在尝试使用SMO使用C#WinForm应用程序创建数据库。 i have created this class to manage things: 我创建了此类来管理事情:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Common;

namespace WindowsFormsApp3
{
    class SqlServerController
    {
        //ServerConnection connection = new ServerConnection("MSSQLSERVER", "sysAdmin", "");
        private Server m_server=null;

        public SqlServerController (string server)
        {
            m_server = new Server(server);
        }

        public void AttachDatabase (string database, StringCollection files,AttachOptions options)
        {
            m_server.AttachDatabase(database, files, options);

        }

        public void AddBackupDevice(string name)
        {
            BackupDevice device = new BackupDevice(m_server,name);
            m_server.BackupDevices.Add(device);

        }

        public string GetServerVersion(string serverName)
        {
            return m_server.PingSqlServerVersion(serverName).ToString();
        }

        public int CountActiveConnections(string database)
        {
            return m_server.GetActiveDBConnectionCount(database);
        }

        public void DeleteDatabase (string database)
        {
            m_server.KillDatabase(database);
        }

        public void DetachDatabse (string database, bool updatestatistics,bool removeFullTextIndex)
        {
            m_server.DetachDatabase(database, updatestatistics, removeFullTextIndex);
        }

        public void CreateDatabse (string database)
        {
            Database db = new Database(m_server, database);
            db.Create();
        }

        public void CreateTable(string database, string table, List<Column> ColumnList,List<Index> IndexList)
        {
            Database db = m_server.Databases[database];
            Table newTable = new Table(db, table);
            foreach (Column column in ColumnList)
                newTable.Columns.Add(column);

            if (IndexList !=null)
            {
                foreach (Index index in IndexList)
                    newTable.Indexes.Add(index);
            }
            newTable.Create();
        }

        public Column CreateColumn (string name, DataType type, string @default,bool isIdentity,bool nullable)
        {
            Column column = new Column();
            column.DataType = type;
            column.Default = @default;
            column.Identity = isIdentity;
            column.Nullable = nullable;

            return column;
        }

        public Index CreateIndex(string name, bool isClustered, IndexKeyType type,string[] columnNameList)
        {
            Index index = new Index();

            index.Name = name;
            index.IndexKeyType = type;
            index.IsClustered = isClustered;

            foreach (string columnName in columnNameList)
                index.IndexedColumns.Add(new IndexedColumn(index, columnName));

            return index;
        }


        //public object ShowTable(string database,string table)
        //{
        //    var allData = from 

        //}

    }
}

also i have a simple button that creates DB, it runs the code belove on click event: 我也有一个创建数据库的简单按钮,它在click事件上运行代码belove:

 private void btnCreateDatabase_Click(object sender, EventArgs e)
        {
            SQL.CreateDatabse("BetaDB");
            List<Column> ColumnList = new List<Column>();
            ColumnList.Add(SQL.CreateColumn("id", DataType.Int,"" ,true, false));
            ColumnList.Add(SQL.CreateColumn("name", DataType.NVarChar(50), "", false, false));
            ColumnList.Add(SQL.CreateColumn("UID", DataType.NVarChar(200), "", false, false));
            ColumnList.Add(SQL.CreateColumn("Pass", DataType.NVarChar(50), "", false, false));
            SQL.CreateTable("BetaDB", "userha", ColumnList, null);



        }

while creating the table i am getting an exception in Visual Studio error message 创建表时,我在Visual Studio中收到异常错误消息

the exception message tells me that there is an issue setting data type for column in this function:: 异常消息告诉我此函数的列设置数据类型存在问题:

public Column CreateColumn (string name, DataType type, string @default,bool isIdentity,bool nullable)
        {
            Column column = new Column();
            column.DataType = type;    // exception message
            column.Default = @default;
            column.Identity = isIdentity;
            column.Nullable = nullable;

            return column;
        }

i had exactly the same problem, and i solved it by using constructor to create Column: 我有完全相同的问题,我通过使用构造函数创建Column来解决了这个问题:

var newTable = new Table(srv.Databases["MyDatabase"], "MyTable");
var c = new Column(newTable, "MyColumn");
c.DataType = new DataType(SqlDataType.NVarCharMax);
newTable.Columns.Add(c);
newTable.Create();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM