Вопрос: Подключение SQL Server без Web.config
ASP MVC Подключения SQL Server без Web.config несколько вариантов
Дело пойдет о подключении базы
Я делал подключение Web.config все работает
но теперь лучше сделать класс что подключет базу
строкой , или значениями класса по атрибутам DataSourse,Host,Password и так далее
ведь когда тестил , все правильно написал
то когда дело дошло к выводу данных с таблице
я получил ошибку типа
Login ......... Password и так далее
И конечно же и вывод ошибки, в случаи провала подключения
Надеюсь кто то поможет поправить это дело
Настраиваем Microsoft SQL Server 2014
1) Заходим под Именем сервера у меня это такое
Server Name: SITY_PC
Жмем свойства Server Properties -> потом Security
выставляем SQL Server and Windows Authentication mode
это нужно, входа в созданную базу, под Логином и Паролем
Перезагружаем сервер Microsoft SQL Server 2014 нажав SITY_PC правой кнопкой мыши , Restart - соглашаемся на все OK
Сервер перезагружаеться приняв новые настройки
2) Заходим в Logins->NT AUTHORITY\система
жмем правой кнопкой мыши по NT AUTHORITY\система , выбираем Properties
там выбираем Server Roles, ставим птичку напротив sysadmin
3) Для удобства добавляем нумерацию строк скриптинга Microsoft SQL Server 2014
Tools->Options->Text Editor->All Languages
напротив Lines numbers поставим галочку
таким образом когда когда будете писать скрипт T-SQL
будут нумеровать строки , и в случаи ошибки будет определена строка ошибки
и вы легко можете пролистав номера строк найти строку ошибки, и править скрипт
4) Готово
Теперь о Главном
Создадим базу с готовой таблицей
1) Вот скрипт
T-SQL |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| CREATE DATABASE [Economics]
USE [Economics]
GO
/****** Object: Table [dbo].[TABLE_ECONOMIC] Script Date: 05.09.2016 11:33:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TABLE_ECONOMIC](
[ID_ECONOMIC] [int] IDENTITY(1,1) NOT NULL,
[TEXT] [nvarchar](3600) NOT NULL,
[COST] [money] NOT NULL,
CONSTRAINT [PK_TABLE_ECONOMIC] PRIMARY KEY CLUSTERED
(
[ID_ECONOMIC] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO |
|
2) Создаем проект SQL_Server_Connect_Test_All зарание подключаем Entity Framework 5.0
Создадим Контроллер Controllers/HomeController.cs
стандарт ничего не меняем
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace SQL_Server_Connect_Test_All.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
} |
|
3) Создадим класс таблицы Tables/TABLE_ECONOMIC.cs
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace SQL_Server_Connect_Test_All.Tables
{
[Table("TABLE_ECONOMIC")]
public class TABLE_ECONOMIC
{
[Key]
public int ID_ECONOMIC { get; set; }
[Required]
[Display(Name = "Текст Економики")]
public string TEXT { get; set; }
[Required]
[Display(Name = "Стоймость")]
public double COST { get; set; }
}
} |
|
4) Нажав ActionResult Index() создаем представление Add View...
Тут и воротим вывод данных
HTML5 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| @using SQL_Server_Connect_Test_All.Models
@using SQL_Server_Connect_Test_All.Tables
@{
ViewBag.Title = "Index";
ManadgerDB manadgerDb=new ManadgerDB();
}
<h2>Index</h2><br/>
<h3>Данные Базы</h3><br/><br/>
@{
foreach (TABLE_ECONOMIC obj in manadgerDb.GET_OBJECTS())
{
<p>1) @obj.TEXT = @obj.COST $</p>
}
} |
|
5) Создаем класс что будет выступать как подключения, и вывод данных с базы
Класс перчик все в одном))
Models/ManadgerDB.cs
Это один вариант
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using SQL_Server_Connect_Test_All.Tables;
namespace SQL_Server_Connect_Test_All.Models
{
interface IRepository_Manadger<T> : IDisposable
{
IEnumerable<TABLE_ECONOMIC> GET_OBJECTS();
SqlErrorCollection GET_ERROR_SQL();
}
public class ManadgerDB : IRepository_Manadger<TABLE_ECONOMIC>
{
private DB_Context db;
public ManadgerDB()
{
string str_connect = @"Data Source=SITY_PC; Initial Catalog=Economics; Integrated Security=true; User ID=PUTIN_IS_KNDR_KOREA; Password=#tyranny";
this.db = new DB_Context(str_connect);
}
//Колекция обьектов
public IEnumerable<TABLE_ECONOMIC> GET_OBJECTS()
{
return db.TableEconomics;
}
//Возвращаем ошибки
public SqlErrorCollection GET_ERROR_SQL()
{
return db.Error_Connect;
}
public void Dispose()
{
db.Dispose();
}
}
//Контекст подключения
public class DB_Context : DbContext
{
public SqlErrorCollection Error_Connect { get; set; }
public DbSet<TABLE_ECONOMIC> TableEconomics { get; set; }
//Имя подключения к базе
public DB_Context() : base("Primaryconect")
{
}
//Подключаем строку
public DB_Context(string connection_str)
{
try
{
Database.Connection.ConnectionString = connection_str;
}
catch (SqlException ex)
{
Error_Connect = ex.Errors;
}
}
}
} |
|
Результат этого применения Ошибка
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The 'COST' property on 'TABLE_ECONOMIC' could not be set to a 'Decimal' value. You must set this property to a non-null value of type 'Double'.
Source=System.Data.Entity
StackTrace:
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Users\Sity\Documents\Visual Studio 2010\Projects\SQL_Server_Connect_Test_All\SQL_Server_Connect_Test_All\Views\Home\Index.cshtml:line 11
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
InnerException:
6) Второй вариант Models/ManadgerDB_2.cs
с кодом , достаточно в Index.cshtml поменять класс ManadgerDB_2 manadgerDb=new ManadgerDB_2();
мы запустим и увидем результат
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using SQL_Server_Connect_Test_All.Tables;
namespace SQL_Server_Connect_Test_All.Models
{
interface IRepository_Manadger2<T> : IDisposable
{
IEnumerable<TABLE_ECONOMIC> GET_OBJECTS();
SqlErrorCollection GET_ERROR_SQL();
}
public class ManadgerDB_2 : IRepository_Manadger2<TABLE_ECONOMIC>
{
private DB_Context2 db;
public ManadgerDB_2()
{
//Подключаем автоматоматически
this.db = new DB_Context2();
}
//Колекция обьектов
public IEnumerable<TABLE_ECONOMIC> GET_OBJECTS()
{
return db.TableEconomics;
}
//Возвращаем ошибки
public SqlErrorCollection GET_ERROR_SQL()
{
return db.Error_Connect;
}
public void Dispose()
{
db.Dispose();
}
}
//Контекст подключения
public class DB_Context2 : DbContext
{
SqlConnectionStringBuilder connectStringBuilder = new SqlConnectionStringBuilder();
SqlConnection conn;
SqlCommand comm;
public SqlErrorCollection Error_Connect { get; set; }
public DbSet<TABLE_ECONOMIC> TableEconomics { get; set; }
//Имя подключения к базе, все в одном
public DB_Context2() : base("Primaryconect2")
{
try
{
connectStringBuilder.DataSource = "SITY_PC";
connectStringBuilder.InitialCatalog = "Economics";
connectStringBuilder.Encrypt = true;
connectStringBuilder.TrustServerCertificate = true;
connectStringBuilder.ConnectTimeout = 30;
connectStringBuilder.AsynchronousProcessing = true;
connectStringBuilder.MultipleActiveResultSets = true;
connectStringBuilder.IntegratedSecurity = true;
connectStringBuilder.UserID = "PUTIN_IS_KNDR_KOREA";
connectStringBuilder.Password = "#tyranny";
conn = new SqlConnection(connectStringBuilder.ToString());
//Передаем строку подключения
Database.Connection.ConnectionString = conn.ConnectionString;
}
catch (SqlException ex)
{
Error_Connect = ex.Errors;
}
}
}
} |
|
Результат этого выполнения Ошибка
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The 'COST' property on 'TABLE_ECONOMIC' could not be set to a 'Decimal' value. You must set this property to a non-null value of type 'Double'.
Source=System.Data.Entity
StackTrace:
at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Users\Sity\Documents\Visual Studio 2010\Projects\SQL_Server_Connect_Test_All\SQL_Server_Connect_Test_All\Views\Home\Index.cshtml:line 11
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.StartPage.RunPage()
at System.Web.WebPages.StartPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
InnerException:
Пример прикрепил SQL_Server_Connect_Test_All.rar
Базу тоже Economics.rar уже есть данные
Вот и думай как же правильно , что не так ?
Ответ: Ну вообще то привелегии должны быть , ведь когда привелегий не было , или они были в master базы как стандарт,
то возникали ошибки NT AUTHORITY\система , быть может это было связано с указанием Integrated Security на отключке , не знаю ?
XML |
1
| Integrated Security = false; |
|
Добавлено через 11 минут
Я шас еще раз подключаю , и пробую интеграцию Sqlite+EntityFramework6
бывают какие то приколы , хотя всеправильно не до чего придраться , это на VS2010
Я сначала использую обычное подключение
ASP MVC -> Base(базовым набором)
уже есть встроеный Entity Framework 5.0
потом аналог
ASP MVC -> Base(базовым набором)
но с использованием консольной установки
Tools->Library Package Manager->Package Manager Console
вбиваем команду
PM> Install-Package EntityFramework
по идее произойдет подмена на новую версию Entity Framework 6
Добавлено через 38 минут
Уже есть не утешительный результат
1) Первый проект что создан на VS2010
ASP MVC Razov - > Base (с базовыми компонентами EF5 версии)
использованием консольной установки
Tools->Library Package Manager->Package Manager Console
после подмены на новую версию Entity Framework 6
PM> Install-Package EntityFramework
Получаем пустоту , данные не вывелись
хотя все правильно проипсано
Добавлено через 47 минут
Теперь Разберемся
1) VS2010 ASP MVC Razov (Base компоненты) -(использование PM> Install-Package EntityFramework)
подмена EF5 на EF6
для того чтоб использовать новую версию EF6 нужно остановить сервер , или перезагрузить проект
после все начнет работать данные будут выводиться
2) VS2010 ASP MVC Razov (Base компоненты) -(использование Install-Package System.Data.SQLite.EF6)
интегрирваный SQLite+EF6
Если вы хотите использовать EF6 , а не SQLite то вам нужно зайти в Web.config
И отключить провайдера SQLite из за которого происходит конфликт
это строка
XML |
1
| <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> |
|
Полностью где она находиться , я ей закоментил отключил
XML |
1
2
3
4
| <providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<!--<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />-->
</providers> |
|
И тогда ошибки не будет , будет выводить данные
В случаи если вы захотите использовать SQLite , а не EF6 то разкоментите эту строку провайдера
и вперед