2014-05-28 2 views
1

У меня возникла проблема с обнаружением моей базы данных. Недавно я добавил базу данных, как вы можете видеть на изображении ниже, и мой запрос выглядит правильно (sql ниже, это то, что linq собирается заменить), но я не уверен, почему Visual Studio не обнаруживает мою базу данных. Когда я пытаюсь добавитьВставка в базу данных с помощью LINQ

using System.Data.Entities 

Я не могу найти его, и я его не использую.

Мои текущие usings:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Text.RegularExpressions; 
using System.Data.SqlClient; 

Следующий скриншот может помочь вам понять, что я пытаюсь сказать (открыть изображение в новой вкладке, чтобы просмотреть его в масштабе 100%):

enter image description here

Спасибо за вашу помощь заранее!

+2

Вы должны добавить слой ORM в ваше приложение, например «Entity Framework». –

+0

Да, вы не добавили модель данных Entity в свой проект –

+0

@HamletHakobyan Не могли бы вы рассказать о том, что такое слой ORM? К сожалению, я новичок. Спасибо за ваш ответ – user3653380

ответ

3

У вас есть несколько вопросов:

  1. Вы не добавили модель для вашего проекта. Я не вижу никаких файлов, связанных с ORM, в обозревателе решений для SqlIntegrationWithVs.

  2. После того, как вы добавите данную модель, так как BloodBank не является собственностью Register Класс; таким образом, он все еще не будет существовать в текущем контексте.

    В общем, ORMs поместить таблицу отображенные классы в отдельном пространстве имен, например BloodBankDatabase.BloodBanks, и объекты, которые позволяют получить доступ к данным таблиц помещаются в отдельный класс, так что вы будете в конечном итоге с чем-то вроде:

    using BloodBankDatabase; 
    
    using (var context = new DatabaseContext(connectionString)) 
    { 
        var returnedPerson = from loginDetails in BloodBank 
             where loginDetails.Username == usersInput 
             select loginDetails.Username; 
    } 
    

Также, глядя на ваш код, вы, кажется, не понимаете, как работает C#. Например:

  • Вы не должны вызывать cmd.Dispose() внутри using (SqlCommand cmd = ...) { }, потому что using уже делает это.

  • SqlDataReader инвентарь IDisposable, поэтому вы забыли об этом using() { }.

  • Вы не должны улавливать Exception.

  • where Username == usersInput не имеет смысла в этом контексте; вы уверены, что понимаете лямбда-выражения?

  • Не bool usernameTaken = false;. Вместо этого объявите переменную как можно ближе к месту, где вы ее используете в первую очередь.

  • Подтвердите свои входы перед их использованием. Что произойдет, если userInput пуст? Или очень долго?

Как вы можете улучшить?

  1. Stack Oveflow не является веб-сайтом обзора кода. Если вы заработаете свой код (и только тогда), вы можете быть заинтересованы в отправке его на адрес https://codereview.stackexchange.com/

  2. Вам также может быть интересно узнать книгу, чтобы узнать C#. C# in Depth by Jon Skeet - это де-факто книга, которую должен прочитать любой начинающий C#.

  3. Если вы работаете в компании, настаивайте на проведении обзоров кода для каждой строки совершенного кода. Попытайтесь получить более опытных разработчиков, чтобы просмотреть ваш код. Если нет, найдите кого-нибудь (друга, старого коллегу), который готов рассмотреть ваш код.

  4. Code analysis, доступный в платных версиях Visual Studio, укажет на вопросы, такие как забытые блоки using() { }. Это намного проще, чем проверка на MSDN каждого класса, который вы используете, чтобы определить, реализует ли он IDisposable.

  5. StyleCop - еще один инструмент, который может вас заинтересовать: он не найдет ошибок как таковых, но заставит вас использовать единый стиль на базе кода.

+0

Спасибо, ты указал мне в правильном направлении. – user3653380

+0

@mainwa Я должен указать после прочтения вашего сообщения полностью в глубину, теперь у меня есть несколько ответов на некоторые вещи, которые вы сказали (не нужно прокомментировать 100% правильные вещи, поскольку они действительно помогли мне). Что вы подразумеваете под «SqlDataReader реализует IDisposable, поэтому вы забыли об использовании() {} вокруг него."? Я раньше менял свое исключение, а значит, незаконченный улов. Я знаю, у меня был менталитет sql в голове, и, поскольку я не мог видеть, что это было неправильно, я не мог это исправить. Я объявляю элемент, который я собираюсь вернуть в начале метода для равномерной читаемости. usersInput проверяется в валидации – user3653380

+0

@ user3653380: я имею в виду, что когда вы используете любой объект, который реализует 'IDisposable', вы ** должны ** (за исключением некоторых очень редких случаев) вставлять его в' using (...) {...} '. Вы уже сделали это для 'SqlConnection' и' SqlCommand' (но поскольку вы также удаляете их вручную, это приведет к [* CA2202: не удалять объекты несколько раз *] (http://msdn.microsoft.com/en- us/library/ms182334.aspx), но он отсутствует для 'SqlDataReader', что приведет к [* CA2213: одноразовые поля должны быть удалены *) (http://msdn.microsoft.com/en-us/library /ms182328.aspx). –

0

Попробуйте добавить

using System.Linq; 

по поводу с помощью утверждений.

+0

Я уже использую это. Я добавлю свои операторы в OP. Спасибо за ваше предложение! – user3653380

Смежные вопросы